SQL Server 2008
我有一个表MyTable
,其中有列A, B, C, D
[当我选择一行时,我只希望列出那些非空/空白的列。结果集将是
A
C
D
如果我的行中B
为空。
实际上,总有一天会出现E
列。但是我可以从另一个表中获取所有可能的列名,并且需要检查MyTable
是否包含其中的任何一个,如果可以,请检查哪个行具有我选择的行的数据
因此:
select * from MyTable where ID = 6
select ColumnName from AllColumnNames
ColumnName
ColumnName
中存在MyTable
并且其中包含数据where ID = 6
,则将ColumnName
添加到输出。有一种方法可以在一个查询中执行此操作?
这会将您的表转换为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'