Azure SQL DW 中的动态方法仅从 table 中获取那些列名,其值对于特定记录不为空

Dynamic approach in Azure SQL DW to get only those column names from a table whose values are not null for a particular record

我有如下 table 结构

列数超过 150。 基本上,我想查询 table 的特定记录说 ID = 1 并且它应该 return 所有不为空的列名。

我期待下面的输出,其中我应该能够 fetch/show 只有那些列名的特定记录的值不为空。

请注意,我正在尝试在不支持 FOR XML 路径子句、光标、非常有限的动态 SQL 功能的 Azure SQL DW 中实现此目的。

UNPIVOT 有效,您不必过滤,因为“UNPIVOT 输入中的空值在输出中消失”,例如

create table #t(id int, col_1 char(1), col_2 char(1), col_3 char(1))
insert into #t values (1,'A',null,'G')
insert into #t values (2,'A','c', null)

select  id, col, val 
from
  ( select * from #t ) p
unpivot
  ( Val for Col in (col_1, col_2, col_3 ) ) as unpvt
order by id, col;

在 Synapse 中 SQL On-Demand 您也可以通过使用 FOR JSON / OPENJSON 来实现这一点。

像这样

create table #t(id int, col_1 char(1), col_2 char(1), col_3 char(1))
insert into #t values (1,'A',null,'G')

select [key] columnName
from openjson(
(
 select * from #t
 where id = 1
 for json path, WITHOUT_ARRAY_WRAPPER 
)) d
where value is not null
and [key] <> 'id'

产出

所以 Synapse SQL 池(又名 Azure SQL DW)最终也应该得到这个。