我有几个数据库,我正在尝试使用相同的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语句检查列类型,然后使用适当的?
答案 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
的列执行此操作