2

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

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

4

1 回答 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)') <> ''

在这里试试:https ://data.stackexchange.com/stackoverflow/query/59187

如果您还想排除 ID 列,请将其添加到 where 子句。

T.X.value('local-name(.)', 'sysname') <> 'ID'
于 2012-01-13T06:19:34.333 回答