簡體   English   中英

在SQL Server中動態計數空值

[英]Dynamically Count Null Values in SQL Server

我對SQL有點陌生,所以請耐心等待。 我正在嘗試編寫一些查詢,使我可以遍歷整個表並查找空值出現在每列中的次數。 通過鍵入以下命令,很容易做到這一點:

Select 
    SUM(CASE COL_1 WHEN IS NULL THEN 1 ELSE 0 END) AS COL_1_NULLS
   ,SUM(CASE COL_2 WHEN IS NULL THEN 1 ELSE 0 END) AS COL_2_NULLS
FROM TABLE1

這很容易,但是如果要對多個表執行此操作,或者單個表具有很多列,則可能會變得很困難。

我正在尋找一種寫查詢的方法,該查詢將表名傳遞給它,然后循環遍歷已定義表中的每一列(可能通過連接到元數據視圖的命令按順序拉出列名?)然后求和列中的null。 在任何人跳上nitpick潮流之前,請記住,這個基本思想不僅可以用於查找空值,還可以用於更多用途。 非常感謝您提供有關此問題的任何幫助。

您需要使用動態sql:

declare @custom_sql varchar(max)
set @custom_sql = 'SELECT null as first_row'
select
    @custom_sql = @custom_sql + ', ' +  'SUM(CASE WHEN ' + COLUMN_NAME + ' IS NULL THEN 1 ELSE 0 END) as ' + COLUMN_NAME + '_NULLS'
from
    INFORMATION_SCHEMA.COLUMNS where table_name = 'MYTABLE'

set @custom_sql = @custom_sql + ' FROM MYTABLE'

exec(@custom_sql)

您還可以使用COALESCE術語(僅用於稍微不同的方法):

declare @custom_sql varchar(max)

select
    @custom_sql = COALESCE(@custom_sql + ', ', '') +  'SUM(CASE WHEN ' + COLUMN_NAME + ' IS NULL THEN 1 ELSE 0 END) as ' + COLUMN_NAME + '_NULLS'
from
    INFORMATION_SCHEMA.COLUMNS where table_name = 'users'

set @custom_sql = 'SELECT ' + @custom_sql

set @custom_sql = @custom_sql + ' FROM Users'

print @custom_sql

exec(@custom_sql)

我不知道如何進行一般查詢,但是您總是可以生成這樣的腳本

declare @sql nvarchar(max) = 'select 1 as dummy'
select @sql = @sql + '
    , sum(case when [' + c.name + '] is null then 1 else 0 end) as [' + c.name + '_NULLS]'
from sys.columns c
join sys.tables t on t.object_id = c.object_id
where t.name = 'TABLE1'

set @sql = @sql + ' from TABLE1'
select @sql

然后您可以執行結果,例如。 exec sp_executesql @sql

對於更酷的方法,可以使用ISNULL跳過第一個逗號。

declare @sql nvarchar(max)
declare @tablename nvarchar(255) = 'xxxx'

Select @sql = ISNULL(@SQL + ',','')  + ' ' + COLUMN_NAME + '_count = Sum(case when ' + COLUMN_NAME + ' is null then 1 else 0 end)' + char(13)
From information_schema.columns
where table_name = @tablename

set @sql = 'Select' + @sql + ' From ' + @tablename

print @sql
exec sp_executesql @sql

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM