有没有快速的方法来检查任何列是否为NULL?

问题描述 投票:0回答:6

我有一张大约有 20 列的表格。除了输入:

Where column1 is null OR column2 is null OR column3 is null etc...

是否有一种更快的方法来检查每一列并查看是否有任何值为空,如果是,则返回该记录?

sql sql-server sql-server-2005 t-sql
6个回答
6
投票

不。有多种方法可以更快地进行编码,但没有像您暗示的那样的捷径。取自我在 dba.stackexchange 上给出的答案

DECLARE @tb NVARCHAR(255), @sql NVARCHAR(MAX);

SET @tb = N'dbo.[table]';

SET @sql = N'SELECT * FROM ' + @tb + ' WHERE 1 = 0';

SELECT @sql = @sql + N' OR ' + QUOTENAME(name) + ' IS NULL'
    FROM sys.columns 
    WHERE [object_id] = OBJECT_ID(@tb);

EXEC sp_executesql @sql;

4
投票

您可以使用如下方式找到列名称:

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = <table_name> 

然后,我将使用它编写一个过程,它将循环遍历表中的条目和列名称。

来源:http://codesnippets.joyent.com/posts/show/337


0
投票

这取决于更快意味着什么。

如果您的意思是让 SQL Server 执行得更快,您可以做的一件事是编写一个触发器,而不是更新指定整行(除了位和主键之外)是否为 NULL 的位列。但是,这样做应该有一个真正充分的理由,因为它会影响您的更新性能。这些列上的索引也会有所帮助。

如果您想要更快地编写,您可以让 SQL 为您生成 where 子句。但是,除非你经常这样做,否则我认为这是不值得花时间的。


0
投票

授人以鱼而不是授人以鱼的答案在这里:

一种方法是创建一个存储过程来组装并运行动态查询。

存储过程将:

  • 有一个表名称作为输入参数。
  • 查询元数据系统表,了解具体的表结构。
  • 使用该表列的
    OR
    语句动态组装字符串(实际查询)。
  • 运行组装的查询并返回结果。

0
投票

您可以通过像这样进行 case 和 sum 来检查。在这里,只要我们看到空值和零,我们就标记 1,然后我们对所有值进行求和

SELECT 
(case when (sum(case when id is null then 1 else 0 end)) > 0 then True else False end) as is_id_null,
(case when (sum(case when id is null then 1 else 0 end)) > 0 then True else False end) as is_name_null
from TABLE; 

0
投票

这也可能有帮助。它生成列出列名称以及表中每列中 NULL 值数量的脚本。获得输出后,您必须将其复制或导出为文本并将其作为脚本运行。

DECLARE @tb VARCHAR(100) = '<schema>.<tableName>'

SELECT  'SELECT col_name = ''' + sys_cols.name + ''', null_count = COUNT(*) FROM ' + @tb + ' WHERE ' + sys_cols.name + ' IS NULL;'
FROM sys.columns sys_cols
WHERE sys_cols.[object_id] = OBJECT_ID('' + @tb + '')
© www.soinside.com 2019 - 2024. All rights reserved.