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

时间:2012-01-13 05:47:12

标签: sql-server-2008 names

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

在一个查询中有一种方法可以做到这一点吗?

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'