Sql-Server
如何查詢 XML 列集中的確切值
我有一個包含 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