Проверка наличия одного или нескольких идентификаторов в строке json - PullRequest
3 голосов
/ 13 февраля 2020

Если у меня есть следующие строки в таблице:

clientId    settings
1           {"franchises":[1,7,9,11,14,20,23,26,27,29,33,34,35,45,49,50,57,58,72,73]}
2           {"franchises":[1]}
3           {"franchises":[50]}

Как бы я запросил это, чтобы получить clientIds с франшизами 1 или 50?

Я пытался сделать

SELECT clientId FROM clientSettings WHERE JSON_VALUE(settings, '$.franchises') IN (1,50)

но это не сработало.

Ответы [ 3 ]

3 голосов
/ 13 февраля 2020

Вы можете использовать json функции:

select distinct c.clientId
from clientSettings c
cross apply openjson(c.settings, '$.franchises') with (franchise integer '$')
where franchise in (1, 50);

Упаковка в exists может работать лучше, так как это избавляет от необходимости агрегирования:

select c.clientId
from clientSettings c
where exists (
    select 1
    from openjson(c.settings, '$.franchises') with (franchise integer '$')
    where franchise in (1, 50)
)

Демонстрация на DB Fiddle (я добавил несоответствующую строку в ваш набор данных с идентификатором 4):

| clientId |
| -------: |
|        1 |
|        2 |
|        3 |
0 голосов
/ 13 февраля 2020

Пожалуйста, попробуйте следующий запрос, используя "CROSS APPLY OPEN JSON" (SQL -FIDDL E):

SELECT c.clientId
FROM clientSettings c
CROSS APPLY OPENJSON(c.settings, '$.franchises') with (franchise integer '$') as f
WHERE f.franchise in (1, 50)
GROUP BY c.clientId;
0 голосов
/ 13 февраля 2020

Еще один способ, который не требует сортировки или агрегирования.

DECLARE @clientSettings TABLE (ClientId INT IDENTITY, Settings VARCHAR(8000));

INSERT @clientSettings(settings)
VALUES
('{"franchises":[0,7,9,11,14,20,23,26,27,29,33,34,35,45,49,55,57,58,72,73,1,50]}'),
('{"franchises":[1]}'),
('{"franchises":[50]}');

SELECT c.clientId
FROM   @clientSettings c
CROSS APPLY
(
    SELECT TOP (1) f.franchise
    FROM   OPENJSON(c.settings, '$.franchises') WITH (franchise INT '$') AS f
    WHERE  f.franchise IN (1, 50)
) AS x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...