回答

收藏

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

本版积分规则