【发布时间】:2019-02-13 00:16:12
【问题描述】:
编辑:尝试查询已被 case 语句缩小范围的 XML 路径列表。列“显示名称”包含整个数据库中的 700 多个唯一值。但是,根据包括 AccountID 在内的其他条件,如果 RenderedValue 为 = '',剩余的结果很可能会小于 5。我查询中的变量是我无法显式声明 Account Id 或 DisplayName。
我有一个成功的 CASE 声明。但是尝试让 XML PATH 语句从表中提取所有数据并用逗号分隔它,而不仅仅是前一个 CASE 语句的结果。无法弄清楚如何将它们嵌套在一起。除了第 1 列中的 GUID,值是 nvarchar。
不带 CASE 的查询
select tb1.AccountID,
tb3.DisplayName,
tb4.RenderedValue
from Accounts tb1
join Display tb2 on tb2.AccountID = tb1.AccountID
inner join ExtractDetail tb3 on tb3.ExtractID = tb2.ExtractID
left join ExtractDetailData tb4 on tb4.ExtractDetailID = tb3.ExtractDetailID
结果:
+-----------+---------------+-----------------------+
| AccountID | DisplayName | RenderedValue |
+-----------+---------------+-----------------------+
| E8175 | FirstName | John |
| E8175 | LastName | Smith |
| E8175 | StreetAddress | 123 Washington Street |
| E8175 | City | |
| E8175 | State | NY |
| E8175 | ZipCode | |
| E8175 | PhoneNumber | 555-555-5555 |
| E8175 | Email | JohnSmith@aol.com |
+-----------+---------------+-----------------------+
带 CASE 的查询
select tb1.AccountID,
CASE When tb4.RenderedValue = ''
Then tb3.DisplayName
Else ''
End As MissingField
from Accounts tb1
join Display tb2 on tb2.AccountID = tb1.AccountID
inner join ExtractDetail tb3 on tb3.ExtractID = tb2.ExtractID
left join ExtractDetailData tb4 on tb4.ExtractDetailID = tb3.ExtractDetailID
Where tb4.RenderedValue =''
结果:
+-----------+--------------+
| AccountID | MissingField |
+-----------+--------------+
| E8175 | City |
| E8175 | ZipCode |
+-----------+--------------+
预期输出:
+-----------+--------------+
| AccountID | MissingField |
+-----------+--------------+
| E8175 | City,ZipCode |
+-----------+--------------+
【问题讨论】:
-
对您来说最简单的答案是转而使用 MySQL 或 Postgres,它们都是免费的,并且具有执行此操作的内置函数。
-
不幸的是,由于我在公司链中的位置和权限,我无法移动/链接数据库。所以我必须在 Management Studio 的范围内工作。
标签: sql-server case for-xml-path