使用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 |
|
|
|
|
|