在包含 json 的 SQL 列中搜索字符串数组中的项目

问题描述 投票:0回答:1

我有一个包含数组数据的 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%?

如有任何建议或问题,我们将不胜感激。

sql sql-server stored-procedures
1个回答
0
投票

不太漂亮,但为了确保

@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
为空,这将匹配当前代码中所需的任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.