回答

收藏

使用XPath / XQuery过滤XML列上的SQL查询

技术问答 技术问答 354 人阅读 | 0 人回复 | 2023-09-14

我有一个带有一个XML列的表。我想过滤掉XML中特定属性与字符串匹配的行,实质上是在WHERE或HAVING中进行。
3 E5 O) I  b9 l' @桌子看起来像这样
( |; T# ?' X* t: E) `7 t/ V| id | xml |$ S+ \7 ^3 _% |  O4 H
和XML类似
1 I( p7 @3 [) e. @
% z8 a1 [% h4 w, M4 [- b8 ?5 `  
: K$ X: L0 }, `7 B# `, U7 f   
( ?, O: F& ~  R3 a9 T7 H  

( l+ {% |- O# @; }& x- m" v8 @; m# u
我想获取所有@name属性与值匹配的ID。* g2 ^  H5 Z8 L9 K( E
我已经能够做到以下几点:3 w" B. D4 i1 {/ A
SELECT id, xml.query('data(/xml/info/@name)') as Value7 N; g% b1 p7 K+ f) b: g
FROM Table1
; y' w& W4 u' D7 z8 V. t) AWHERE CAST(xml.query('data(/xml/info/@name)') as varchar(1024)) = @match7 ~% b+ h" f+ Q; k
但这非常慢。
. K0 G+ A' {9 X) o5 W% y. R必须有更好的方法来对查询的输出进行过滤。% [7 O' d% T2 t  I* l
               
. Z2 Z. }$ N1 a1 }& q* _6 d解决方案:
0 O# S; ]9 D; b- n               
1 [" p" p  p6 E
8 l1 t3 }5 {$ z1 l( t- M9 [1 E5 d+ q2 U( u+ B( J: [9 y. N/ Q
                找到了。而不是使用query(),我应该使用exist()。: `* A9 i8 s1 `& v2 M, R# Z6 R
我的查询将是
8 a; `8 I4 s2 N9 Z) S" _2 VSELECT id, xml.query('data(/xml/info/@name)') as Value
. E8 \9 V- Z  D0 JFROM Table1
- S1 L5 N; ?0 o  z" |WHERE xml.exist('/xml/info/[@name=sql:variable("@match")]') = 1
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则