选择数据不为空或空白的列名称

问题描述 投票:2回答:1

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添加到输出。

有一种方法可以在一个查询中执行此操作?

sql-server-2008 names
1个回答
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'
© www.soinside.com 2019 - 2024. All rights reserved.