Oracle как найти строки, содержащие некоторое значение в столбце массива json

#arrays #json #oracle

#массивы #json #Oracle

Вопрос:

Oracle Я хочу отфильтровать строки из таблицы, где столбец view_role массива json имеет значение 1. Решение может быть только в предложении where или с использованием join. Я потратил 3 дня на это решение, пожалуйста, подскажите мне, что я делаю неправильно.

 CREATE TABLE test_fields
(
   field_id      NUMBER  NOT NULL,
     field_name VARCHAR2(100),
   view_role     VARCHAR2(1000) CHECK (view_role IS JSON)
);


INSERT INTO test_fields VALUES(1, 'StaffName', '[1,10,50,100]');
INSERT INTO test_fields VALUES(2, 'Salary', '[50,100]');
INSERT INTO test_fields VALUES(2, 'Email', '[10,50,100]');
commit;

SELECT * FROM TEST_FIELDS;

        


-- I want to find fields for role 1;
    
SELECT f.field_id, f.field_name
       jt.role
  FROM TEST_FIELDS f,
       json_table(f.view_role[*]
         COLUMNS ("ROLE" VARCHAR2(20) PATH '$')) jt
 WHERE jt.role = 1;
 

  

Ответ №1:

Ваше использование JSON_TABLE неверно. Первый аргумент — это значение JSON для преобразования в таблицу, а второй аргумент — определение селекторов JSON для поиска необходимой информации.

Этот запрос должен дать вам то, что вы ищете:

 SELECT *
  FROM test_fields, JSON_TABLE (view_role, '$[*]' COLUMNS (role NUMBER PATH '$')) jt
 WHERE jt.role = 1;
  

Комментарии:

1. Большое вам спасибо, что это решило мою проблему. У меня есть еще одна просьба, не могли бы вы поделиться со мной, где условие без объединения JSON_TABLE может использовать Json_exists

2. Невозможно найти конкретное значение в массиве JSON с помощью JSON_EXISTS, но вы можете использовать регулярное выражение, если хотите, с таким запросом SELECT * FROM test_fields WHERE REGEXP_LIKE (view_role, 'D1D')

3. Хорошо, спасибо за ваше решение и быстрый ответ. Это также полезно в моих вариантах использования