SQL Server 2008
我有一个表MyTable
,其中包含A, B, C, D
列
当我选择一行时,我想要一个只包含非空/空白列的列表。结果集将是
A
C
D
如果我的行中B
为空。
实际上,某天可能会有一列E
。但是我可以从另一个tabie中获取所有可能的列名,并且需要检查MyTabie
是否包含任何列名称,如果是,那么哪些列表中包含我选择的行的数据
因此:
select * from MyTable where ID = 6
select ColumnName from AllColumnNames
ColumnName
ColumnName
中存在MyTable
并且其中包含数据where ID = 6
,请将<{1}}添加到输出中。在一个查询中有一种方法可以做到这一点吗?
答案 0 :(得分:3)
这会将您的表转换为CTE中的XML,然后使用XQuery查找没有空值的节点名称。如果您的列名不破坏XML节点名称的规则,这将起作用。
;with C(TableXML) as
(
select *
from MyTable
where ID = 6
for xml path('T'), elements xsinil, type
)
select T.X.value('local-name(.)', 'sysname') as ColumnName
from C
cross apply C.TableXML.nodes('/T/*') as T(X)
where T.X.value('.', 'nvarchar(max)') <> ''
在此尝试:http://data.stackexchange.com/stackoverflow/query/59187
如果您想要排除ID列,请添加where子句。
T.X.value('local-name(.)', 'sysname') <> 'ID'