如何仅获取SQL Server中现有表中至少有一个非空值的列

doinxwow  于 2023-01-16  发布在  SQL Server
关注(0)|答案(1)|浏览(172)

例如,我有一个名为Product的表,其中包含以下数据:
| 产品标识|p_名称|p_类别|
| - ------|- ------|- ------|
| 1个|衬衫|零|
| 第二章|零|零|
| 三个|盖|零|
假设我不知道表中的行数和列数,也不知道哪些列完全为空(所有行中没有非空值),如何编写一个查询来检索行中至少有一个非空值的列,我的方法如下,但没有得到正确的输出:

select
column_name
into #TempColumns
from information_schema.columns
where 
table_name = 'Product'
and table_schema = 'DDB'
declare @CurrentColumn nvarchar(max) = '', @IsNull bit, @NonNullCols nvarchar(max) = ''
declare Cur cursor for 
select column_name from #TempColumns
open Cur

while 1=1
begin
fetch next from Cur into @CurrentColumn
select @IsNull = case when count(@CurrentColumn) > 0 then 0 else 1 end
from Product

if @IsNull = 1
begin 
set @NonNullCols = @NonNullCols + ',' + @CurrentColumn
end
if @@fetch_status <> 0 break
end
close Cur
deallocate Cur
select @NonNullCols as NullColumns
drop table #TempColumns

如果有任何其他的方法或更正我以上(T-SQL)查询。提前感谢。
首先,我创建了一个临时表来存储Product表中所有可用的列名,然后我在这个临时表中循环,提取每一行,并使用计数在product表中检查该列是否完全为空()函数。如果列完全为空,则条件将位变量设置为1,然后将该特定列名存储在另一个变量中,然后检索该变量作为空列。

czq61nw1

czq61nw11#

下面是一个概念示例。
它使用SQL Server XML和XQuery功能,而不使用动态SQL和游标/循环。
算法非常简单,当我们把每一行转换成XML时,XML中缺少包含NULL值的列。

SQL语言

USE tempdb;
GO

DROP TABLE IF EXISTS #tmpTable;

CREATE TABLE #tmpTable (
     client_id int,
     client_name varchar(500),
     client_surname varchar(500),
     city varchar(500),
     state varchar(500));
    
INSERT #tmpTable VALUES
(1,'Miriam',NULL,'Las Vegas',NULL),
(2,'Astrid',NULL,'Chicago',NULL),
(3,'David',NULL,'Phoenix',NULL),
(4,'Hiroki',NULL,'Orlando',NULL);

SELECT DISTINCT x.value('local-name(.)', 'SYSNAME') AS NotNULLColumns
FROM #tmpTable AS t
    CROSS APPLY (SELECT t.* FOR XML PATH(''), TYPE, ROOT('root')) AS t1(c)
    CROSS APPLY c.nodes('/root/*') AS t2(x);

产出

| 非空列|
| - ------|
| 城市|
| 客户端ID|
| 客户端名称|

相关问题