Sql 如何在多个条件下过滤XML字段
我有一张这样的桌子:Sql 如何在多个条件下过滤XML字段,sql,sql-server,xml,sql-server-2012,cross-apply,Sql,Sql Server,Xml,Sql Server 2012,Cross Apply,我有一张这样的桌子: CREATE TABLE MyTable( Id [int] IDENTITY(1,1) NOT NULL, XmlField xml NULL, /// Some other fields ) XML字段包含C字典的XML表示形式。例如: 如果我添加和x.fields.value'key/int/text[1],'int'=2和x.fields.value'value/string/text[1],'varcharMAX'=Email',那么逻辑
CREATE TABLE MyTable(
Id [int] IDENTITY(1,1) NOT NULL,
XmlField xml NULL,
/// Some other fields
)
XML字段包含C字典的XML表示形式。例如:
如果我添加和x.fields.value'key/int/text[1],'int'=2和x.fields.value'value/string/text[1],'varcharMAX'=Email',那么逻辑上不会返回任何内容
我也尝试过不使用交叉应用,而是使用一个简单的过滤器:
SELECT TableId, XmlField FROM MyTable
WHERE XmlField.exist('/dictionary/item/key/int[text() = 1]') = 1
AND XmlField.exist('/dictionary/item/value/string[text() = "Web"]') = 1
但是,它的行为类似于OR,并将返回xml包含2个键值对的行,例如1,Email和2,Web类似的东西应该可以做到这一点 挑选* 从MyTable作为T 其中T.XmlField.exist'/dictionary[item[key/int/text=1和value/string/text=Web]和 项[key/int/text=2和value/string/text=Email]]'=1
简直完美。看来我需要一个XPath速成班!谢谢
SELECT TableId, XmlField FROM MyTable
CROSS APPLY XmlField.nodes('/dictionary/item') x(fields)
WHERE (x.fields.value('(key/int/text())[1]', 'int') = 1
AND x.fields.value('(value/string/text())[1]', 'varchar(MAX)') = 'Web')
SELECT TableId, XmlField FROM MyTable
WHERE XmlField.exist('/dictionary/item/key/int[text() = 1]') = 1
AND XmlField.exist('/dictionary/item/value/string[text() = "Web"]') = 1