我有一个包含数组数据的 SQL 列,例如:
["Jimmy","Johnny","Jeffry","Jacob","Justin","Joseph","Josh","Jared"]
or could be
["Jimmy","Johnny","Jeffry"].
我需要从存储过程中搜索与列中所有名称匹配的名称。查询可以有 1 个或所有这些名称。
我目前正在使用 OPENJSON 来过滤“Jimmy”或“Johnny”等个人名称,但现在的要求是,如果他们选择“全部”,我需要带回仅包含所有名称的列,而不仅仅是 1 个名称,因此 -
["Jimmy","Johnny","Jeffry","Jacob","Justin","Joseph","Josh","Jared"]
and not
["Jimmy","Johnny"]
因此,当他们在 UI 中选择“全部”时,我正在考虑让传入的 sql 参数成为所有名称的列表(上面列出的所有名称),以逗号分隔。
@Names = 'Jimmy,Johnny,Jeffry,Jacob,Justin,Joseph,Josh,Jared'
目前正在寻找我正在做的单个项目:
(@Names IN ( SELECT value FROM OPENJSON(a.Names)) OR @Names IS NULL)
我相信这个要求可能超出了 OpenJson 的范围,但不确定还可以尝试什么,也许是 LIKE%?
如有任何建议或问题,我们将不胜感激。
不太漂亮,但为了确保
@Names
数组中不存在 Names
列中不存在的名称,您可以这样做
DECLARE @T TABLE
(
Names NVARCHAR(MAX)
);
INSERT @T
VALUES (N'["Jimmy","Johnny","Jeffry","Jacob","Justin","Joseph","Josh","Jared"]')
DECLARE @Names NVARCHAR(MAX) = N'["Jimmy","Johnny","Jeffry"]'
SELECT *
FROM @T T
WHERE NOT EXISTS (SELECT value
FROM OPENJSON(@Names)
EXCEPT
SELECT value
FROM OPENJSON(T.Names))
如果
@Names
为空,这将匹配当前代码中所需的任何内容。