JSON_VALUE не работает в предложении where на сервере SQL - PullRequest
0 голосов
/ 06 мая 2020

У меня есть JSON данных в столбце моей таблицы. Я пытаюсь применить условие where к столбцу JSON и получить записи.

Employee таблица:

enter image description here

Здесь это мой SQL запрос:

SELECT ID, EMP_NAME 
FROM EMPLOYEE 
WHERE JSON_VALUE(TEAM, '$') IN (2, 3, 4, 5, 7, 10) 

Я получаю пустой результат, когда использую этот запрос. Любая помощь в том, как это сделать?

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Вам необходимо проанализировать JSON в столбце TEAM с помощью OPENJSON():

Table:

CREATE TABLE EMPLOYEE (
   ID int,
   EMP_NAME varchar(50),
   TEAM varchar(1000)
)
INSERT INTO EMPLOYEE (ID, EMP_NAME, TEAM)
VALUES
   (1, 'Name1', '[2,11]'),
   (2, 'Name2', '[2,3,4,5,7,10]'),
   (3, 'Name3', NULL)

Statement:

SELECT DISTINCT e.ID, e.EMP_NAME 
FROM EMPLOYEE e
CROSS APPLY OPENJSON(e.TEAM) WITH (TEAM int '$') j
WHERE j.TEAM IN (2,3,4,5,7,10) 

Результат:

ID  EMP_NAME
1   Name1
2   Name2

В качестве дополнительной опции, если вы хотите получить совпадения в виде агрегированного текста, вы можете использовать следующий оператор (требуется SQL Server 2017):

SELECT e.ID, e.EMP_NAME, a.TEAM
FROM EMPLOYEE e
CROSS APPLY (
   SELECT STRING_AGG(TEAM, ',') AS TEAM
   FROM OPENJSON(e.TEAM) WITH (TEAM int '$')
   WHERE TEAM IN (2,3,4,5,7,10) 
) a
WHERE a.TEAM IS NOT NULL

Результат:

ID  EMP_NAME TEAM
1   Name1    2
2   Name2    2,3,4,5,7,10
1 голос
/ 06 мая 2020

JSON_VALUE возвращает скалярное значение, а не набор данных, как вы думаете. Если вы запустите SELECT JSON_VALUE('[2,3,4,5,7,10]','$'), вы увидите, что он возвращает NULL, так что да, строки не будут возвращены.

Вам нужно рассматривать JSON как набор данных, а не одно значение:

SELECT ID, EMP_NAME 
FROM EMPLOYEE E
WHERE EXISTS (SELECT 1
              FROM OPENJSON (E.TEAM) OJ
              WHERE OJ.Value IN (2,3,4,5,7,10))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...