使用XPath / XQuery过滤XML列上的SQL查询
技术问答
404 人阅读
|
0 人回复
|
2023-09-14
|
我有一个带有一个XML列的表。我想过滤掉XML中特定属性与字符串匹配的行,实质上是在WHERE或HAVING中进行。8 b( S( ^9 z6 V
桌子看起来像这样
4 f% A' Z! Y, ?8 H; P/ ^1 S| id | xml |
; Y2 P, V- b: C和XML类似+ U* _9 z% T S1 Z
, k- P _4 u8 l! z( _ . J9 C; y9 G1 V( N0 C2 a
Z8 u* S- j. `2 E, |# W1 w7 E$ o
1 {( ]4 ?3 v: ~! ~, \
" w$ A6 p9 a9 B- z
我想获取所有@name属性与值匹配的ID。
) y/ Z7 Z& e# W9 F9 P# ?% l0 E我已经能够做到以下几点:
X/ `- l$ t8 q3 ]% \7 A! HSELECT id, xml.query('data(/xml/info/@name)') as Value3 g6 a0 g o" t' @/ x# a/ b2 D9 y
FROM Table1
( c* C- g J# U: W9 }0 P4 I0 |WHERE CAST(xml.query('data(/xml/info/@name)') as varchar(1024)) = @match
6 \0 a. c) c5 E6 T3 T6 w但这非常慢。, T5 M: }7 V) |' {8 F1 F3 c8 b
必须有更好的方法来对查询的输出进行过滤。8 I5 [ o+ f3 ~! z. M
, ]! Z; \5 b5 i4 D f- @解决方案:2 ~$ j2 ^0 f/ C1 d
0 j' ?4 Q6 _! f. T4 l
# R- t( v Z5 w9 K' @) C5 V
8 h A; n5 Z6 t, K! Q 找到了。而不是使用query(),我应该使用exist()。
( X% I% E2 I6 G& P' R我的查询将是# P, W$ F3 \" q% ~
SELECT id, xml.query('data(/xml/info/@name)') as Value
$ ~5 y( {" R# J, R9 LFROM Table1
) ]* K C- L( o$ k1 s% iWHERE xml.exist('/xml/info/[@name=sql:variable("@match")]') = 1 |
|
|
|
|
|