#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. Хорошо, спасибо за ваше решение и быстрый ответ. Это также полезно в моих вариантах использования