Sql 数组列中的Where子句
我有一列,里面有值[NONCODE,OFFCR,SPVR,CORD] 当其中一个值列中的匹配项 从表中选择*列,列='SPVR'-将为真或返回值 从表中选择*列,其中列='MGR'-将为false或返回空值 在该字段列中,我有一个值Sql 数组列中的Where子句,sql,sql-server,Sql,Sql Server,我有一列,里面有值[NONCODE,OFFCR,SPVR,CORD] 当其中一个值列中的匹配项 从表中选择*列,列='SPVR'-将为真或返回值 从表中选择*列,其中列='MGR'-将为false或返回空值 在该字段列中,我有一个值 ["NONCODE","OFFCR", "SPVR", "CORD"] ["NONCODE","OFFCR", "SPVR", "CORD"] ["ASST-MGR"] ["ASST-MGR"] ["MGR"] ["MGR"] 如果我质疑 从列='SPVR'所
["NONCODE","OFFCR", "SPVR", "CORD"]
["NONCODE","OFFCR", "SPVR", "CORD"]
["ASST-MGR"]
["ASST-MGR"]
["MGR"]
["MGR"]
如果我质疑
从列='SPVR'所在的表中选择*
结果显示唯一一行包含“SPVR”
从列='MGR'所在的表中选择*
结果显示唯一包含“MGR”的行,但不显示包含“ASST-MGR”的行
如果我使用“LIKE”命令,则包含MGR的所有行都将出现,而您当前的结构并不理想,您应该避免将CSV数据存储到常规SQL列中,我们可以尝试以下解决方法:
SELECT array_col
FROM yourTable
WHERE array_col LIKE '%' + '"SPVR"' + '%';
注意:SQL Server至少当前不支持本机数组类型。一种解决方法是使用临时表或表值参数。您可以使用新的字符串分割tsql函数将csv值分割为单个值。这是在SQL 2016兼容级别130中引入的。例如:
CREATE TABLE #myTable(vals varchar(100))
INSERT INTO #myTable(vals)
VALUES('"NONCODE","OFFCR","SPVR","CORD"'), ('"NON","CODE", "PACE", "RACE"')
SELECT *
FROM #myTable CROSS APPLY string_split(vals, ',')
WHERE value = '"SPVR"'
除了给出答案之外,我建议在这种情况下使用charindex:
SELECT array_col
FROM yourTable
WHERE CHARINDEX("SPVR", array_col) > 0
原始答复:
如果您使用SQL Server 2016+,您可以尝试使用OPENJSON函数解析此数据,因为[NONCODE、OFFCR、SPVR、CORD]是有效的JSON数组。是一个表值函数,用于解析JSON文本,因此可以使用任何基于集合的方法来获得预期结果
表:
CREATE TABLE #Data(
[Text] varchar(100)
)
INSERT INTO #Data
([Text])
VALUES
('["NONCODE","OFFCR", "SPVR", "CORD"]'),
('["NONCODE","OFFCR", "SPVR", "CORD"]'),
('["ASST-MGR"]'),
('["ASST-MGR"]'),
('["MGR"]'),
('["MGR"]')
声明:
SELECT d.*
FROM #Data d
CROSS APPLY OPENJSON(d.[Text]) j
WHERE j.[value] = 'SPVR'
-- or, if needed:
-- WHERE j.[value] LIKE '%MGR%'
输出:
-----------------------------------
Text
-----------------------------------
["NONCODE","OFFCR", "SPVR", "CORD"]
["NONCODE","OFFCR", "SPVR", "CORD"]
更新:
对于SQL Server 2012,您可以尝试使用XML拆分数据:
SELECT
t.[Text]
FROM (
SELECT
[Text],
CAST(CONCAT('<x>', REPLACE(REPLACE(REPLACE(REPLACE([Text], '[', ''), ']', ''), ' ', ''), ',', '</x><x>'), '</x>') AS xml) AS XMLText
FROM #Data
) t
CROSS APPLY (
SELECT N.value('.', 'varchar(100)') AS [value]
FROM t.XMLText.nodes('x') AS x(N)
) c
WHERE c.[value] = '"SPVR"'
您是否尝试过什么是SQL Server版本,列值到底是什么-[NONCODE,OFFCR,SPVR,CORD]还是NONCODE,OFFCR,SPVR,CORD?谢谢。SQL Server不支持阵列。该列的数据类型是什么datatype@FajarTaufik . . . 您的任何查询都不会返回匹配项,因为它们不接受'['和''考虑在内。不清楚您在问什么。我的原始答案没有多大改进。您应该放弃存储CSV,改进表设计IMHO。不幸的是,我使用了SQL Server2012@FajarTaufik请参阅更新的答案。在此处使用XML是一个选项。谢谢。Wowsome,您是对的,这是答案,谢谢或者你的回答。