【问题标题】:T-SQL to return delimited list of columns with NULL valuesT-SQL 返回具有 NULL 值的分隔列列表
【发布时间】:2014-09-10 10:00:12
【问题描述】:

对于视图中的每一行,我需要返回该行的 ID 列,以及该行中包含 NULL 的所有列的分隔列表。

所以:

ID | Test1 | Test2 | Test3
5    'a'     'b'     NULL
6    'a'     'b'     'c'
7    NULL    'b'     NULL

会返回:

ID | InvalidColumns
5    Test3
7    Test1,Test3

我在 SO 上看到了解决方案,它可以告诉您是否有任何列具有 NULL,或者表中所有行的列是否具有 NULL,但没有任何内容可以列出每行的列。

谢谢!

--编辑--

除了 ID 列之外,表中的列是未知的。我需要一个适用于任何带有 ID 列的表/视图的解决方案。

【问题讨论】:

  • 列是否固定?最简单的解决方案是使用一堆 CASE 语句,但需要预定义列。
  • 它们不是固定的,我需要一个灵活的解决方案来覆盖任何表格/视图。

标签: sql sql-server tsql


【解决方案1】:

您可以使用这样的查询(需要STUFF 删除前导逗号 ):

SELECT ID, 
STUFF(
 CONCAT(CASE WHEN Test1 IS NULL THEN ',Test1' END,
        CASE WHEN Test2 IS NULL THEN ',Test2' END,
        CASE WHEN Test3 IS NULL THEN ',Test3' END
       ), 1, 1, '') as InvalidColumns
FROM table1 WHERE Test1 IS NULL OR Test2 IS NULL OR Test3 IS NULL;

如果您想使查询动态化,请使用以下查询:

DECLARE @table AS NVARCHAR(MAX),
    @cols1 AS NVARCHAR(MAX),
    @cols2 AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @table = 'Table1'

SET @cols1 = STUFF((SELECT distinct ',CASE WHEN ' + QUOTENAME(c.COLUMN_NAME) + ' IS NULL THEN '',' + c.COLUMN_NAME + ''' END' 
            FROM INFORMATION_SCHEMA.columns c
            WHERE TABLE_SCHEMA = 'dbo' and TABLE_NAME = @table And COLUMN_NAME <> 'Id'
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @cols2 = STUFF((SELECT distinct 'OR ' + QUOTENAME(c.COLUMN_NAME) + ' IS NULL ' 
            FROM INFORMATION_SCHEMA.columns c
            WHERE TABLE_SCHEMA = 'dbo' and TABLE_NAME = @table And COLUMN_NAME <> 'Id'
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
            ,1,3,'')

SET @query = N'SELECT ID, STUFF(CONCAT(' + @cols1 + '), 1, 1, '''') as InvalidColumns FROM ' + @table + ' WHERE ' + @cols2

--SELECT @cols1, @cols2, @query
EXEC sp_executesql @query

它产生以下结果:

| ID | INVALIDCOLUMNS |
|----|----------------|
|  5 |          Test3 |
|  7 |    Test1,Test3 |

SQL Fiddle

【讨论】:

  • 列名未知,只有表和ID列存在于其上
  • 谢谢,我会将此标记为答案。但是,很高兴看到不依赖动态 SQL 的解决方案。
  • 我认为如果列名未知,则没有其他办法。我提供的第一个查询是为已知的 couns 做这项工作,它不是动态的
【解决方案2】:

如果列是固定的,此查询会有所帮助。

SELECT ID, 
 CONCAT(case when Test1 is null then 'Test1' end,
    case when Test1 is  null and (test2 is null or test3 is null) then ',' end, 
    case when Test2 is null then  'Test2' end,
    case when (Test1 is  null or test2 is null ) and test3 is null then ',' end,    
    case when Test3 is null then  'Test3' end
    )
 as InvalidColumns
FROM table1 WHERE Test1 IS NULL OR Test2 IS NULL OR Test3 IS NULL

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 2020-01-30
    • 2020-10-04
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2019-08-30
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多