[英]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.