Bro*_*nie 5 sql sql-server sql-server-2008
我正在使用SQL Server2008。我在一个表上有一个列名列表,我想知道如何使用SQL返回那些只包含零或NULL值的列名。
这是一种蛮力方法,因为您知道所有列名称。
CREATE TABLE dbo.splunge
(
a INT,
b INT,
c INT,
d INT
);
INSERT dbo.splunge VALUES (0,0,1,-1), (0,NULL,0,0), (0,0,0,NULL);
SELECT
cols = STUFF(
CASE WHEN MIN(COALESCE(a,0)) = MAX(COALESCE(a,0)) THEN ',a' ELSE '' END
+ CASE WHEN MIN(COALESCE(b,0)) = MAX(COALESCE(b,0)) THEN ',b' ELSE '' END
+ CASE WHEN MIN(COALESCE(c,0)) = MAX(COALESCE(c,0)) THEN ',c' ELSE '' END
+ CASE WHEN MIN(COALESCE(d,0)) = MAX(COALESCE(d,0)) THEN ',d' ELSE '' END,
1, 1, '')
FROM dbo.splunge;
-- result:
-- a,b
GO
DROP TABLE dbo.splunge;
Run Code Online (Sandbox Code Playgroud)
假设您知道所需列的命名方案或数据类型(或者只是完全省略 where 子句并手动删除不需要的列) ,您可能可以生成此脚本的大部分内容,而不是手动执行。
SELECT CHAR(13) + CHAR(10) + ' + CASE WHEN MIN(COALESCE(' + name + ',0)) = '
+ 'MAX(COALESCE(' + name + ',0)) THEN '',' + name + ''' ELSE '''' END'
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.splunge')
-- AND system_type_id = 56
-- AND name LIKE '%some pattern%'
;
Run Code Online (Sandbox Code Playgroud)
输出看起来像第一个查询的中间,因此您可以复制并粘贴,然后删除第一个查询+并添加周围STUFF的查询...