如何查询 XML 列集中的确切值

mhe*_*all 6 xml sql-server xquery sql-server-2016 sparse-column

我有一个包含 80 多个稀疏列和一个列集列的表,这是一个简单的例子:

DROP TABLE IF EXISTS #ColumnSet
GO

CREATE TABLE #ColumnSet
(
    Id        INT          NOT NULL
  , Value1    VARCHAR(100) SPARSE NULL 
  , Value2    VARCHAR(100) SPARSE NULL 
  , Value3    VARCHAR(100) SPARSE NULL 
  , Value4    VARCHAR(100) SPARSE NULL 
  , AllValues XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
)
GO

INSERT INTO #ColumnSet
(Id, Value1, Value2, Value3, Value4)

VALUES
(1, 'POSITIVE', NULL, NULL, NULL),
(2, 'NEGATIVE', NULL, 'NEGATIVE', NULL),
(3, NULL, NULL, 'NEGATIVE', 'POSITIVE'),
(4, 'NEGATIVE', NULL, 'THIS IS NOT A POSITIVE RESULT', NULL)
GO
Run Code Online (Sandbox Code Playgroud)

我想查询列集以标识其中任何列具有 POSITIVE 值的行。

使用value列集上的方法会将所有值连接到一个字符串中,我可以使用,LIKE但我不想要该值在另一个字符串中的结果。

SELECT
    *

FROM
    #ColumnSet

WHERE
    AllValues.value('/', 'nvarchar(4000)') LIKE '%POSITIVE%'
Run Code Online (Sandbox Code Playgroud)

是否有查询列集的替代方法来实现上述目的?使用APPLY连同nodes方法提供了相同的连接字符串输出,虽然我的语法可能不正确。

所需的输出:

id
1
3
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 8

text()在谓词之前指定节点将比text()在谓词中指定更有效。

select *
from #ColumnSet as C
where AllValues.exist('*/text()[. = "POSITIVE"]') = 1
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


谓词中有文本的查询计划 AllValues.exist('*[text() = "POSITIVE"]') = 1

在此处输入图片说明


For*_*est 5

这是一个 XPath 解决方案,虽然我不知道它的效率如何。

SELECT *
FROM #ColumnSet
WHERE AllValues.exist('//*[text() = "POSITIVE"]') = 1
Run Code Online (Sandbox Code Playgroud)