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
- 如果
MyTable
中存在ColumnName
并且其中有数据其中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)') <> ''
在这里试试:https://data.stackexchange.com/stackoverflow/query/59187
如果您还想排除 ID 列,请将此添加到 where 子句。
T.X.value('local-name(.)', 'sysname') <> 'ID'
关于sql-server-2008 - 选择数据不为空或空白的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8846474/