使用XPath / XQuery过滤XML列上的SQL查询
技术问答
403 人阅读
|
0 人回复
|
2023-09-14
|
我有一个带有一个XML列的表。我想过滤掉XML中特定属性与字符串匹配的行,实质上是在WHERE或HAVING中进行。0 q y. Q# C/ a6 v% B: t
桌子看起来像这样; ~) D7 f* G$ I5 k. ]& {" D' X! r
| id | xml |
7 q7 @6 K* r3 w+ \和XML类似6 r3 C7 S0 w9 w: g K
8 C* O6 } d _# V: M/ ?: I3 F
8 d9 {) V1 W7 y5 @+ ?2 q) k
1 g9 h0 {- ~5 E( W* E2 g0 l & v! w# V6 x9 k( \: ~/ X2 V) M
, N8 u* D7 ` C7 K' t8 L* L
我想获取所有@name属性与值匹配的ID。
8 X9 }( A6 ^* m3 A我已经能够做到以下几点:# ?9 o5 e, R9 J
SELECT id, xml.query('data(/xml/info/@name)') as Value
* G, K4 s1 ~$ @1 a6 w% tFROM Table17 W* d6 o1 p5 V& L" E) w/ S0 x8 P
WHERE CAST(xml.query('data(/xml/info/@name)') as varchar(1024)) = @match& j- V* G: C2 v P* b9 J
但这非常慢。
: B6 y3 G; M6 Y) I* V( [4 v6 u5 ^7 L必须有更好的方法来对查询的输出进行过滤。# z4 q4 z) c- m/ b& \
4 C, D s8 [& ~8 l' J. h' u; A
解决方案:
1 U+ k4 M) s+ p1 M
4 M1 m( e& ~5 j0 S- ]
& L. S) U1 z$ R# _% d& S+ G% }7 Y4 c/ P" L# L* U, p4 K/ X: j
找到了。而不是使用query(),我应该使用exist()。( r, T2 Y9 n4 h7 o3 J+ t( ^
我的查询将是
+ M) d: h+ _( u( f JSELECT id, xml.query('data(/xml/info/@name)') as Value
7 J* C! W% V3 {+ FFROM Table1+ P4 B7 q4 ?4 `3 b. t7 V1 `
WHERE xml.exist('/xml/info/[@name=sql:variable("@match")]') = 1 |
|
|
|
|
|