查找仅包含零的列

Bro*_*nie 5 sql sql-server sql-server-2008

我正在使用SQL Server2008。我在一个表上有一个列名列表,我想知道如何使用SQL返回那些只包含零或NULL值的列名。

Aar*_*and 2

这是一种蛮力方法,因为您知道所有列名称。

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的查询...