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)最终也应该得到这个。
我有如下 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)最终也应该得到这个。