我有一个供应商数据库,用于包含100"用户定义字符串"列。它们的数据类型为varchar,长度为255.
我需要返回所有不为空的行,以便我可以找出每个行中存储的内容。多年来输入已无法控制,因此userdefinedstring1可以包含多行中的文本,日期,数字,空字符串或NULL。
我的初步解决方案只是
SELECT
*
FROM userdefinedstring table
WHERE userdefinedstring1 IS NOT NULL
OR userdefinedstring2 IS NOT NULL
再重复98次。
有可能有更好的方法来做到这一点,但我还没有确定它,所以任何提示你都会受到赞赏。
答案 0 :(得分:5)
我能想到的唯一改进是在COALESCE
子句中使用WHERE
而不是OR
:
SELECT *
FROM userdefinedstringTable
WHERE COALSECE( userdefinedstring1
, userdefinedstring2
...
) IS NOT NULL
根据您的DBMS产品,可能会有特定于供应商的改进方法,但一般来说,这可能是最好的。
答案 1 :(得分:2)
RBarry的COALESCE是一个好主意,您可以使用它来列出所有感兴趣的列:
SELECT c.name ColumnName
FROM sys.columns AS c
JOIN sys.types AS t ON c.user_type_id=t.user_type_id
WHERE t.name = 'varchar'
AND t.max_length = 255
ORDER BY c.OBJECT_ID;
很有可能使用EXCEL快速制作查询:
=A1&","
复制以制作你的badass COALESCE
声明。
答案 2 :(得分:2)
以下是在所有列上生成合并的查询:
SELECT 'SELECT *
FROM userdefinedstringTable
WHERE COALESCE (' + STUFF(
(SELECT ', [' + name + ']'
FROM sys.columns WHERE Object_ID = object_id('userdefinedstringTable')
FOR XML PATH (''))
, 1,1,'') + ') IS NOT NULL'