在不知道列类型的情况下将NULL值转换为“UNKNOWN”

时间:2013-08-20 13:01:58

标签: php sql sql-server

我有几个数据库,我正在尝试使用相同的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

问题是有些列是float,有些是nvarchar(254)。在float列中,null值为0.在nvarchar(254)列中,null值只是NULL。我需要将nvarchar(254)列中的NULL值设置为“UNKNOWN”,并将float列中的0值设置为“UNKNOWN”。

这是我的意思的一个例子。 ColumnOne和ColumnTwo是float,而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)

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

ISNULL(ColumnOne, 'UNKNOWN')

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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

的列执行此操作