Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数组列中的Where子句_Sql_Sql Server - Fatal编程技术网

Sql 数组列中的Where子句

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]

当其中一个值​​列中的匹配项

从表中选择*列,列='SPVR'-将为真或返回值 从表中选择*列,其中列='MGR'-将为false或返回空值 在该字段列中,我有一个值

["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,您是对的,这是答案,谢谢或者你的回答。