Я хочу изменить следующий запрос, чтобы извлечь атрибут значения из объектов в массиве JSON и вывести таблицу следующим образом:
«значение1», «значение2»
Однако мой запрос в настоящее время выводит весь объект JSON для каждой записи в массиве.
Я хочу сделать это, чтобы можно было использовать его в качестве подзапроса для выражения IN.
SELECT valueJson
FROM (
(
SELECT JSON_EXTRACT_ARRAY(values) AS valueJson
FROM (
SELECT JSON_QUERY(tag, '$.values') AS values
FROM UNNEST(JSON_EXTRACT_ARRAY(
JSON
'[{"active":true,"key":"key1","values":[{"active":true,"value":"value1"}]},{"active":true,"key":"key2","values":[{"active":true,"value":"value2"}]}]')) AS tag
)
)
)
Спасибо!
Я придумал это, но рад принять другой ответ с объяснениями или улучшениями:
SELECT
JSON_EXTRACT_SCALAR(valueJson, '$.value') AS value
FROM (
SELECT valueJson
FROM (
SELECT JSON_QUERY(tag, '$.values') AS valuesArray
FROM UNNEST(JSON_EXTRACT_ARRAY(
JSON '[{"active":true,"key":"key1","values":[{"active":true,"value":"values1"}]},{"active":true,"key":"key2","values":[{"active":true,"value":"value2"},{"active":true,"value":"value3"}]}]' )) AS tag )
JOIN UNNEST(JSON_EXTRACT_ARRAY(valuesArray)) AS valueJson )
WHERE JSON_EXTRACT_SCALAR(valueJson, '$.value') IS NOT NULL
Рассмотрим нижеприведенный подход. Он чистый и тонкий, поэтому говорит сам за себя.
with your_data as (
select JSON '[{"active":true,"key":"key1","values":[{"active":true,"value":"values1"}]},{"active":true,"key":"key2","values":[{"active":true,"value":"value2"},{"active":true,"value":"value3"}]}]' json
)
select val.value
from your_data,
unnest(json_extract_array(json)) el,
unnest(json_extract_array(el.values)) val
с выходом
Спасибо, я вижу, что могу просматривать структуру JSON понятным и простым способом с помощью нескольких выражений, разделенных запятыми, в FROM. Я ценю помощь