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)
text()
在谓词之前指定节点将比text()
在谓词中指定更有效。
select *
from #ColumnSet as C
where AllValues.exist('*/text()[. = "POSITIVE"]') = 1
Run Code Online (Sandbox Code Playgroud)
谓词中有文本的查询计划 AllValues.exist('*[text() = "POSITIVE"]') = 1
这是一个 XPath 解决方案,虽然我不知道它的效率如何。
SELECT *
FROM #ColumnSet
WHERE AllValues.exist('//*[text() = "POSITIVE"]') = 1
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1150 次 |
最近记录: |