我在表ALL_MRN
列PID3
中跟踪了XML:
<Repetitions>
<Repetition>
<Field>10228^^^L8 MRN^MRN</Field>
<Component_1>10228</Component_1>
<Component_2>L8 MRN</Component_2>
<Component_3>MRN</Component_3>
</Repetition>
<Repetition>
<Field>00283^^^CMRN^CMRN</Field>
<Component_1>00283</Component_1>
<Component_2>CMRN</Component_2>
<Component_3>CMRN</Component_3>
</Repetition>
<Repetition>
<Field>00294^^^L7 MRN^MRN</Field>
<Component_1>00283</Component_1>
<Component_2>L7 MRN</Component_2>
<Component_3>MRN</Component_3>
</Repetition>
</Repetitions>
我正在尝试在CMRN
标记中找到Component_3
值,如果找到,则将Component_1
和Component_3
中的值连接起来以形成字符串。
是否可以不使用游标或循环?获得这个串联字符串的最佳方法是什么?
答案 0 :(得分:2)
这个怎么样:
SELECT
C1_and_C3 = XRep.value('(Component_1)[1]', 'varchar(50)') + XRep.value('(Component_3)[1]', 'varchar(50)')
FROM
dbo.ALL_MRN
CROSS APPLY
PID3.nodes('/Repetitions/Repetition') AS XTbl(XRep)
WHERE
XRep.value('(Component_3)[1]', 'varchar(50)') = 'CMRN'
SQL Server 2005和更新版本有非常好的XQuery支持 - 实际上不需要游标!
顺便说一句:你的XML无效 - 你不能拥有一个领先的<Component_3>
代码,并且使用</Component_5>
关闭该代码(同样适用于<Component_2>....</Component_4>
)
答案 1 :(得分:2)
另一个选项,它使用XQuery语言和exist方法。 如果exists方法返回1(True),则表示Component_3标记包含CMRN值
DECLARE @xml xml =
'<Repetitions>
<Repetition>
<Field>10228^^^L8 MRN^MRN</Field>
<Component_1>10228</Component_1>
<Component_2>L8 MRN</Component_2>
<Component_3>MRN</Component_3>
</Repetition>
<Repetition>
<Field>00283^^^CMRN^CMRN</Field>
<Component_1>00283</Component_1>
<Component_2>CMRN</Component_2>
<Component_3>CMRN</Component_3>
</Repetition>
<Repetition>
<Field>00294^^^L7 MRN^MRN</Field>
<Component_1>00283</Component_1>
<Component_2>L7 MRN</Component_2>
<Component_3>MRN</Component_3>
</Repetition>
</Repetitions>'
DECLARE @Component_3 varchar(50) = 'CMRN'
SELECT xmlCol.value('Component_1[1]', 'varchar(50)') + xmlCol.value('Component_3[1]', 'varchar(50)')
FROM @xml.nodes('//Repetitions/Repetition') xmlTab(xmlCol)
WHERE xmlCol.exist('Component_3[text() = sql:variable("@Component_3")]') = 1
请参阅SQLFiddle
答案 2 :(得分:1)
有效。 PID3是varchar类型,所以我不得不转换为XML。这是更新版本。
SELECT
C1_and_C3 = XRep.value('(Component_1)[1]', 'varchar(50)') + XRep.value('(Component_3)[1]', 'varchar(50)')
FROM
dbo.ALL_MRN
CROSS APPLY
(select cast(PID3 as XML) ) as t1(x)
CROSS APPLY
x.nodes('/Repetitions/Repetition') AS XTbl(XRep)
WHERE
XRep.value('(Component_3)[1]', 'varchar(50)') = 'CMRN'