0

我有几个数据库,我试图用相同的 SQL 代码在我的网站上查询。我正在将我想通过 URL 使用的列名/表传递到新页面。例如:

/some/url.php?table=tableName&c1=ColumnOne&c2=ColumnTwo&c3=ColumnThree&n=3

我有几个这些 URL 都链接到同一页面(但具有不同的表名和列)。在下一页上,PHP 代码将是这样的

for ($j = 1; $j <= $n; $j++) {
    // Since the number of column variables varies (there could be c1 and c2, or c1 -> c5), you need to save this part of the query in a variable
    $variables .= ${'c' . $j} . ', ';
}

SELECT $variables
FROM db.dbo.tableName

所以这 3 列的实际查询是

SELECT ColumnOne, ColumnTwo, ColumnThree
FROM db.dbo.tableName

问题是有些列是浮动的,有些是 nvarchar(254)。在浮点列中,空值为 0。在 nvarchar(254) 列中,空值只是 NULL。我需要 nvarchar(254) 列中的 NULL 值为“UNKNOWN”,浮点列中的 0 值也为“UNKNOWN”。

这是我的意思的一个例子。ColumnOne 和 ColumnTwo 是浮点数,而 ColumnThree 是 nvarchar(254)。

---------------------------------------------
|ColumnOne    |ColumnTwo     |ColumnThree   |
---------------------------------------------
|0            |142563        |Insert        |
---------------------------------------------
|1            |348           |Some          |
---------------------------------------------
|2            |2535          |NULL          |
---------------------------------------------
|3            |0             |Value         |
---------------------------------------------
|0            |82536         |NULL          |
---------------------------------------------
|5            |0             |Here          |
---------------------------------------------

这是我希望它看起来的样子

---------------------------------------------
|ColumnOne    |ColumnTwo     |ColumnThree   |
---------------------------------------------
|UNKNOWN      |142563        |Insert        |
---------------------------------------------
|1            |348           |Some          |
---------------------------------------------
|2            |2535          |UNKNOWN       |
---------------------------------------------
|3            |UNKNOWN       |Value         |
---------------------------------------------
|UNKNOWN      |82536         |UNKNOWN       |
---------------------------------------------
|5            |UNKNOWN       |Here          |
---------------------------------------------

我试过这个

SELECT ISNULL(ColumnOne, 'UNKNOWN'), ISNULL(ColumnTwo, 'UNKNOWN'), ISNULL(ColumnThree, 'UNKNOWN')
FROM db.dbo.tableName

但是,我收到此错误:Error converting data type varchar to float

有人可以帮我吗?这将不胜感激!


编辑:我知道要将浮点列中的 0 值转换为 UNKNOWN,我需要这样做

(CASE WHEN ColumnOne = 0 THEN 'UNKNOWN' ELSE CAST(ColumnOne AS varchar(255)) END)

并将 NULL 值转换为 nvarchar(254) 列中的 UNKNOWN,我需要这样做

ISNULL(ColumnOne, 'UNKNOWN')

我只是不知道列类型。有没有办法做一个 CASE 语句来检查列类型,然后使用适当的?

4

3 回答 3

2

您不能UNKNOWN在浮点列中沿浮点值选择单词。您需要将所有浮点值转换为 varchar。转换后,您可以轻松地将 0 或 NULL 替换为其他单词。

SELECT ISNULL(NULLIF(CAST(ColumnOne AS NVARCHAR(254)),'0'),'UNKNOWN')
FROM db.dbo.tableName

(首先用 NULL 替换所有零,然后用 'UNKNOWN' 替换所有 NULLS - 确保替换 0 和 NULL)

由于将 varchar 转换为 varchar 不会造成任何伤害,因此如果您不知道哪些是动态的,您可以对所有列使用相同的语法。

SELECT 
  ISNULL(NULLIF(CAST(ColumnOne AS NVARCHAR(254)),'0'),'UNKNOWN') as ColumnOne
 ,ISNULL(NULLIF(CAST(ColumnTwo AS NVARCHAR(254)),'0'),'UNKNOWN') as ColumnTwo
 ,ISNULL(NULLIF(CAST(ColumnThree AS NVARCHAR(254)),'0'),'UNKNOWN') as ColumnThree
FROM db.dbo.tableName

SQLFiddleDEMO

于 2013-08-20T13:09:31.587 回答
1

您不能将 Varchar 值存储在列类型 Float 中。您必须将列类型更改为 varchar 才能存储“未知”值。此外,如果您不想更改列类型,则在获取结果集时将浮点值(0)转换为 Varchar,然后将其替换为“未知”

select (Case Convert(varchar(500),Column1) when '0' Then 'Unknown' 
when null then 'Unknown' Else  Column1 end)Column1

这里我首先将值转换为 varchar,然后如果值为 0,则将其转换为 Null,然后将 Null 替换为 'Unknown'

于 2013-08-20T13:04:33.950 回答
1

您必须将非字符列值转换为字符,以便函数的所有可能输出值都具有相同的类型。使用Str()功能

SELECT ISNULL(Str(ColumnOne, 8,4), 'UNKNOWN'), 
       ISNULL(str(ColumnTwo, 8,4), 'UNKNOWN'), 
       ISNULL(Str(ColumnThree, 8, 4), 'UNKNOWN')
 FROM db.dbo.tableName

对所有还不是 VARCHAR 的列执行此操作

于 2013-08-20T13:05:45.307 回答