Sql-Server

如何查詢 XML 列集中的確切值

  • August 23, 2018

我有一個包含 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

我想查詢列集以辨識其中任何列的值為 POSITIVE 的行。

在列集上使用該value方法會將所有值連接到一個字元串中,我可以使用LIKE,但我不希望值在另一個字元串中的結果。

SELECT
   *

FROM
   #ColumnSet

WHERE
   AllValues.value('/', 'nvarchar(4000)') LIKE '%POSITIVE%'

是否有查詢列集以實現上述目標的替代方法?儘管我的語法可能不正確,但APPLY與該方法一起使用會提供相同的串聯字元串輸出。nodes

所需的輸出:

id
1
3

在謂詞之前指定text()節點將比在謂詞中更有效text()

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

在此處輸入圖像描述


謂詞中帶有文本的查詢計劃AllValues.exist('*[text() = "POSITIVE"]') = 1

在此處輸入圖像描述

這是一個 XPath 解決方案,雖然我不知道它的效率如何。

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

引用自:https://dba.stackexchange.com/questions/215491