【问题标题】:Converting Every Child Tags in to a Single Column with multiple Delimiters (SQL Server)将每个子标记转换为具有多个分隔符的单列 (SQL Server)
【发布时间】:2017-06-08 11:35:09
【问题描述】:

这是我的 XML

<plan>
  <prescription>
    <name>ABC</name>
    <frequency>Daily</frequency>
    <dailyfrequency>
       <morning>2</morning>
       <afternoon></afternoon>
       <night>1</night>
    </dailyfrequency>
  </prescription>
  <prescription>
    <name>EDF</name>
    <frequency>Daily</frequency>
    <dailyfrequency>
      <morning>5</morning>
      <afternoon>5</afternoon>
      <evening>4</evening>
      <night>1</night>
   </dailyfrequency>
   <dayfrequency></dayfrequency>
  </prescription>
  <prescription>
    <name>YTER</name>
    <frequency>Weekly</frequency>
    <dailyfrequency>
      <morning>5</morning>
      <afternoon>5</afternoon>
      <evening>4</evening>
      <night>1</night>
    </dailyfrequency>
    <dayfrequency>Monday,Tuesday,Wednesday</dayfrequency>
  </prescription>
</plan>

我使用交叉连接进行如下查询

PLAN=    STUFF(XMLData.query('for $a in 
    (*:ClinicalDocuments/Visits/Visit/prescriptions/prescription) 

return <a>{concat("$", $a)}</a>').value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

但是我的结果会这样显示

**PLAN**
ABCDaily21$EDFDaily5541$YTERWeekly5541Monday,Tuesday,Wednesday

但我真的很想像下面这样(假设$-处方内每个标签的分隔符!-列分隔符每个处方本身

**PLAN**
ABC$Daily$2$0$0$1$0!EDF$Daily$5$5$4$1$0!YTER$Weekly$5$5$4$1$Monday,Tuesday,Wednesday

请任何人在这里帮助我!

(注意:某些子标签可能不存在,即表示它没有值)

非常感谢,Jayendran

【问题讨论】:

    标签: sql-server xml tsql xpath xquery


    【解决方案1】:

    以下可能是您需要的,但我真的不知道您想如何处理 不存在的元素。在您的示例中,您放置了0,但这不是缺失值,而是专用默认值。这需要一些关于底层数据类型的知识......

    试试这个:

    DECLARE @xml XML=
    N'<plan>
      <prescription>
        <name>ABC</name>
        <frequency>Daily</frequency>
        <dailyfrequency>
           <morning>2</morning>
           <afternoon></afternoon>
           <night>1</night>
        </dailyfrequency>
      </prescription>
      <prescription>
        <name>EDF</name>
        <frequency>Daily</frequency>
        <dailyfrequency>
          <morning>5</morning>
          <afternoon>5</afternoon>
          <evening>4</evening>
          <night>1</night>
       </dailyfrequency>
       <dayfrequency></dayfrequency>
      </prescription>
      <prescription>
        <name>YTER</name>
        <frequency>Weekly</frequency>
        <dailyfrequency>
          <morning>5</morning>
          <afternoon>5</afternoon>
          <evening>4</evening>
          <night>1</night>
        </dailyfrequency>
        <dayfrequency>Monday,Tuesday,Wednesday</dayfrequency>
      </prescription>
    </plan>';
    

    更新:添加了一个谓词以排除 &lt;dailyfrequence&gt;

    SELECT STUFF(
    (
        SELECT '!' + STUFF(p.query(N'for $n in .//*[local-name()!="dailyfrequency"]
                               return <a>{concat("$",($n/text())[1])}</a>'
                            ).value(N'.',N'nvarchar(max)'),1,1,'')
        FROM @xml.nodes(N'/plan/prescription') AS A(p)
        FOR XML PATH(''),TYPE).value(N'.',N'nvarchar(max)'),1,1,'')
    

    结果

    ABC$Daily$2$$1!EDF$Daily$5$5$4$1$!YTER$Weekly$5$5$4$1$Monday,Tuesday,Wednesday
    

    缺失值用无值表示。

    【讨论】:

    • 感谢我们的回答,它工作正常。当我稍微更改了我的 xml 并尝试我们的回答时,它的行为有所不同。我已经发布了另一个包含所有相关细节的问题,请你看一下.谢谢
    • 我在这里发布的问题stackoverflow.com/questions/44481065/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多