回答

收藏

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

本版积分规则