Как разобрать JSON в предложении where (SQL Server) - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь проанализировать столбец

Пример данных столбца

[{"id":"100190","role":"Company"},{"id":"1049","role":"Person"}]

Пример таблицы

| item | perm                                                             | 
|------|------------------------------------------------------------------|
| a100 | NULL                                                             |
| a101 | NULL                                                             |
| b200 | [{"id":"100190","role":"Company"},{"id":"1049","role":"Person"}] |
| b201 | [{"id":"100190","role":"Company"},{"id":"1049","role":"Person"}] | 

Пример процедуры

declare @id int = 1049

select *
from someTable
where contains(openjson(perm, '$') with (
  id int '$.id'
), @id)

** Превышение выходных данных **

| item | perm                                                             | 
|------|------------------------------------------------------------------|
| b200 | [{"id":"100190","role":"Company"},{"id":"1049","role":"Person"}] |
| b201 | [{"id":"100190","role":"Company"},{"id":"1049","role":"Person"}] | 

Как выбрать строки, содержащие заданный идентификатор, из встроенного массива JSON?

Ответы [ 2 ]

5 голосов
/ 11 октября 2019

Использование CROSS APPLY на вашем JSON даст вам то, что вы хотите.

Вот пример, который вы можете запустить в SSMS:

-- Create table --
DECLARE @Data TABLE ( item VARCHAR(10), perm NVARCHAR(MAX) );

-- Add sample data --
INSERT INTO @Data ( item, perm ) VALUES
( 'a100', NULL ),
( 'a101', NULL ),
( 'b200', '[{"id":"100190","role":"Company"},{"id":"1049","role":"Person"}]' ),
( 'b201', '[{"id":"100190","role":"Company"},{"id":"1049","role":"Person"}]' );

-- Create id param --
DECLARE @id INT = 1049;

-- Select rows where JSON.id equals @id --
SELECT
    d.item, d.perm, j.id
FROM @Data AS d
CROSS APPLY (

    SELECT id FROM OPENJSON( d.perm ) WITH (
        id INT '$.id'
    )

) AS j
WHERE
    j.id = @id
ORDER BY
    d.item;

, который возвращает:

+------+------------------------------------------------------------------+------+
| item |                               perm                               |  id  |
+------+------------------------------------------------------------------+------+
| b200 | [{"id":"100190","role":"Company"},{"id":"1049","role":"Person"}] | 1049 |
| b201 | [{"id":"100190","role":"Company"},{"id":"1049","role":"Person"}] | 1049 |
+------+------------------------------------------------------------------+------+
1 голос
/ 11 октября 2019

Вы можете использовать OPENJSON для анализа массива JSON и CROSS APPLY для фильтрации строк:

declare @id int = 1049;

select t.*
from t
cross apply(select * from OPENJSON(t.perm, '$') WITH (id INT '$.id') where id = @id) sub;

db <> fiddle demo

...