【问题标题】:How to generate XML path within CASE如何在 CASE 中生成 XML 路径
【发布时间】: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


【解决方案1】:
i think this code will help you 
create table  #temp (AccountID varchar(20),DisplayName varchar(20),RenderedValue   varchar(255))
 insert into #temp (AccountID,DisplayName,RenderedValue) values 
 ('E8175','FirstName','John')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values 
 ('E8175','LastName','Smith')
 insert into #temp (AccountID,DisplayName,RenderedValue) values 
 ('E8175','StreetAddress','123 Washington Street')

 insert into #temp (AccountID,DisplayName,RenderedValue) values ('E8175','City','')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values        
 ('E8175','State','NY')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values 
 ('E8175','ZipCode','')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values 
 ('E8175','PhoneNumber','555-555-5555 ')
 insert into #temp (AccountID,DisplayName,RenderedValue)  values 
 ('E8175','Email','JohnSmith@aol.com')





  SELECT distinct
P.AccountID,
STUFF
(
    (
        SELECT ',' +  case when RenderedValue = '' Then DisplayName Else '' End  
        FROM #temp M

        FOR XML PATH(''), type
    ).value('.', 'varchar(max)'), 1, 1, ''
     ) AS Temp
     FROM
    #temp P


  Drop table #temp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多