供应商数据库包含具有100个用户定义的字符串列的表,需要查找该表中非空的所有实例

时间:2013-06-27 16:58:20

标签: sql sql-server sql-server-2008

我有一个供应商数据库,用于包含100"用户定义字符串"列。它们的数据类型为varchar,长度为255.

我需要返回所有不为空的行,以便我可以找出每个行中存储的内容。多年来输入已无法控制,因此userdefinedstring1可以包含多行中的文本,日期,数字,空字符串或NULL。

我的初步解决方案只是

SELECT 
* 
FROM userdefinedstring table 

WHERE userdefinedstring1 IS NOT NULL 

OR userdefinedstring2 IS NOT NULL 

再重复98次。

有可能有更好的方法来做到这一点,但我还没有确定它,所以任何提示你都会受到赞赏。

3 个答案:

答案 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'