使用XPath / XQuery过滤XML列上的SQL查询
技术问答
312 人阅读
|
0 人回复
|
2023-09-14
|
我有一个带有一个XML列的表。我想过滤掉XML中特定属性与字符串匹配的行,实质上是在WHERE或HAVING中进行。
! r7 c# R4 K- T% s' r桌子看起来像这样
- ?: o( A; R' U0 A| id | xml |2 j! c* o% [% j, f8 \
和XML类似2 x% A4 L& }7 ^- S Z
B2 ^3 `# R* S3 o
/ t C. A1 f; G; z( K/ N) d: c
$ M7 b' d1 _( o: H; B/ e9 E2 a
1 B6 l' z8 F4 O& T1 T+ I
- [1 [: ]1 ~& k n我想获取所有@name属性与值匹配的ID。6 p: |, K' T+ k+ H S; `+ q
我已经能够做到以下几点:: s' f% S# u5 p# p
SELECT id, xml.query('data(/xml/info/@name)') as Value2 p+ Q6 F, M/ }: j r
FROM Table1; A9 I7 B P6 p* _8 a D' Y+ p
WHERE CAST(xml.query('data(/xml/info/@name)') as varchar(1024)) = @match0 @/ Z9 D: q+ b
但这非常慢。6 |, U5 G) L" Q$ G9 [& \
必须有更好的方法来对查询的输出进行过滤。8 D, q' c5 S4 E& G7 l3 n" R3 S1 R
( |/ [/ S6 F, m/ z7 H" s
解决方案:
; N: @3 F6 f7 b+ o
* P, c# O* X$ v: r8 W4 M
% E8 ]; ^0 W& H @! c( l7 h. L& T4 D9 t; y
找到了。而不是使用query(),我应该使用exist()。
0 i9 \2 G- z! U" U; a我的查询将是! G& E1 @/ Z. u1 L0 m( e
SELECT id, xml.query('data(/xml/info/@name)') as Value* ]8 ^4 W; p1 P7 y. h" F6 [* I
FROM Table1
4 b7 M9 y; a. r# p' C* [WHERE xml.exist('/xml/info/[@name=sql:variable("@match")]') = 1 |
|
|
|
|
|