2

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

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

我最初的解决方案只是

SELECT 
* 
FROM userdefinedstring table 

WHERE userdefinedstring1 IS NOT NULL 

OR userdefinedstring2 IS NOT NULL 

又重复了 98 次。

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

4

3 回答 3

5

我能想到的唯一改进是COALESCEWHERE子句中使用,而不是OR

SELECT *
FROM   userdefinedstringTable
WHERE  COALSECE( userdefinedstring1
               , userdefinedstring2
                ...
               ) IS NOT NULL

根据您的 DBMS 产品,可能会有特定于供应商的改进方法来做到这一点,但一般来说,这可能是最好的。

于 2013-06-27T17:06:58.893 回答
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&","复制下来制作你的坏话COALESCE

于 2013-06-27T17:07:47.210 回答
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'
于 2013-06-27T18:03:52.153 回答