Sql 供应商数据库包含具有100个用户定义字符串列的表,需要查找该表中所有不为null的匹配项
我有一个web应用程序的供应商数据库,其中有100个“用户定义字符串”列。它们的数据类型为varchar,长度为255 我需要返回所有不为null的行,以便找出每个行中存储的内容。由于无法控制多年来输入的内容,因此userdefinedstring1可以跨多行包含文本、日期、数字、空字符串或NULL 我的最初解决方案就是Sql 供应商数据库包含具有100个用户定义字符串列的表,需要查找该表中所有不为null的匹配项,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个web应用程序的供应商数据库,其中有100个“用户定义字符串”列。它们的数据类型为varchar,长度为255 我需要返回所有不为null的行,以便找出每个行中存储的内容。由于无法控制多年来输入的内容,因此userdefinedstring1可以跨多行包含文本、日期、数字、空字符串或NULL 我的最初解决方案就是 SELECT * FROM userdefinedstring table WHERE userdefinedstring1 IS NOT NULL OR user
SELECT
*
FROM userdefinedstring table
WHERE userdefinedstring1 IS NOT NULL
OR userdefinedstring2 IS NOT NULL
又重复了98次
可能有更好的方法可以做到这一点,但我还没有决定,所以我们非常感谢您提供的任何建议 我能想到的唯一改进是在
WHERE
子句中使用coalise
,而不是或:
SELECT *
FROM userdefinedstringTable
WHERE COALSECE( userdefinedstring1
, userdefinedstring2
...
) IS NOT NULL
根据您的DBMS产品,可能有特定于供应商的改进方法,但一般来说,这可能是最好的方法。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&“,”
向下复制以制作你的恶棍合并语句。以下是在所有列上生成合并的查询:
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'
您是否有一个包含98个字段的表?您只需指定有一个“数据库”就可以了。SQL 2008是指SQL Server 2008吗?是的,SQL Server 2008感谢您的澄清。我编辑了这个问题,以反映这是数据库中的一个表。这是为了溢出的目的,我需要弄清楚它是如何被使用的。问题是“SQL 2008”,但没有标记,感谢共享标准,很高兴离开我的SQL Server世界。谢谢你的回答。在本例中,基于我有限的查询,统计数据显示合并速度大约快33%。