获取始终为空的表列名

3

我有一张表格,其中有很多列。其中一些列始终为NULL,不包含任何值。

是否有一种方法可以使用SQL查询列出这些列,而不是逐个测试它们?
我想避免以下操作:

SELECT Col1 from MyTable where Col1 IS NOT NULL
SELECT Col2 from MyTable where Col2 IS NOT NULL
...

你尝试过什么?正在使用哪些表格? - Reisclef
4
你现在使用的是什么数据库? - Gordon Linoff
一个表的结构永远不会允许您定义一个无名列。我猜您要么是指您有一个查询中硬编码的未命名值,要么是想找到一个值始终为空的列。您能否澄清一下您的问题? - Dom DaFonte
2个回答

3
假设您正在使用SQL Server,只需将表名分配给@strTablename
在这个例子中,我假设dbo.MyTable是表名。
DECLARE @strTablename  varchar(100) = 'dbo.MyTable'
DECLARE @strQuery  varchar(max) = ''
DECLARE @strUnPivot as varchar(max) = ' UNPIVOT ([Count] for [Column] IN ('

CREATE TABLE ##tblTemp([Column] varchar(50), [Count]  Int)

SELECT @strQuery = ISNULL(@strQuery,'') + 'Count([' + name + ']) as [' + name + ']  ,' from sys.columns where object_id = object_id(@strTablename) and is_nullable = 1
SELECT @strUnPivot = ISNULL(@strUnPivot,'') + '[' + name + '] ,' from sys.columns where object_id = object_id(@strTablename) and is_nullable = 1


SET @strQuery = 'SELECT [Column],[Count] FROM ( SELECT ' + SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + @strTablename + ') AS p ' + SUBSTRING(@strUnPivot,1,LEN(@strUnPivot) - 1) + ')) AS unpvt '

INSERT INTO ##tblTemp EXEC (@strQuery)

SELECT [Column] from ##tblTemp Where [Count] =0

DROP TABLE ##tblTemp

2

MAX(col)只有在该列的所有行都为空时才为空。因此,对每一列都进行检查,并将那些表达式为空的名称连接起来。

  select 
  'null columns: ' +
  case when max(col1) is null then 'col1 ' else '' end +
  case when max(col2) is null then 'col2 ' else '' end +
  case when max(col3) is null then 'col3 ' else '' end +
  case when max(col4) is null then 'col4 ' else '' end +
  ...
from mytable;

我遇到了一个错误:在“|”附近有语法错误。 - oshi oshi
那么你使用的是不符合标准的数据库管理系统(DBMS)。(你忘记标记你的DBMS,所以我不知道是哪一种。)例如,SQL Server 使用 + 代替 ||,而在 MySQL 中,你需要使用 CONCAT 函数进行字符串拼接。 - Thorsten Kettner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接