使用XPath / XQuery过滤XML列上的SQL查询
技术问答
353 人阅读
|
0 人回复
|
2023-09-14
|
我有一个带有一个XML列的表。我想过滤掉XML中特定属性与字符串匹配的行,实质上是在WHERE或HAVING中进行。7 L) L8 q3 x0 x% v- C
桌子看起来像这样
$ S n1 }; y3 K* X9 J| id | xml |- A5 C% _+ F5 p/ }
和XML类似4 y2 |: t* G! M0 m r8 L# a7 Y
* i9 o# R0 I( Y& \4 |0 ?
Z# }: J! e$ P0 N8 S
, V O3 E A5 L: \" `# t2 W9 D
5 Q8 e" e6 e% C
9 A9 ^& i: |' U我想获取所有@name属性与值匹配的ID。, `: Q$ x* g8 w/ R, _
我已经能够做到以下几点:
: M! ]1 m* n, U | ?5 MSELECT id, xml.query('data(/xml/info/@name)') as Value
5 e5 B" G3 A4 C) w- ?# lFROM Table1- W: h6 C1 } Q( \9 X
WHERE CAST(xml.query('data(/xml/info/@name)') as varchar(1024)) = @match+ L% M8 D! l; G* R
但这非常慢。
; y! L2 `; ]/ ~0 k- @! @6 C' g必须有更好的方法来对查询的输出进行过滤。
* I' W' U/ L: }9 C" s" L1 o
' k& ]/ i: G9 U解决方案:# z* I4 F. Z- o* q3 ~
$ b6 O- O0 H$ ~, ?3 N4 c
( {" G, j+ T5 h
- `& S8 s8 [! z1 h 找到了。而不是使用query(),我应该使用exist()。6 E4 s' b8 e! `1 m# ]- S0 L1 J
我的查询将是
- h4 u( c1 G# c* Q( `9 ?SELECT id, xml.query('data(/xml/info/@name)') as Value' I$ R/ _% O- W) f$ Q' ], Y; S
FROM Table18 v6 w2 O, X7 n
WHERE xml.exist('/xml/info/[@name=sql:variable("@match")]') = 1 |
|
|
|
|
|