回答

收藏

使用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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则