У меня есть образец моего набора данных, который выглядит так:
WITH raw_string AS (
SELECT CAST
(
'{
"1261369621021236":["It was interactive and the guy was v nice"]
,"4806456876149982":["Mediahub"]
,"501699158168566":["Yes"]
,"293482916246997":["Do it IRL"]
,"1748555938809400":["Europe, Middle East, or Africa (EMEA)"]
,"3019471278301443":["Storytelling for Impact"]
,"1051072995806230":["Yes"],"687313266038215":["28042022"]
,"406048341357670":["Somewhat agree"]
,"304353711772145":["Very satisfied"]
}'
AS JSON
) AS answers_text
)
SELECT *,
JSON_EXTRACT_SCALAR(answers_text, '$["1261369621021236"]') AS q1 FROM raw_string
Почему это возвращает ноль? Я пытаюсь получить значение, которое в данном случае должно быть: «Это было интерактивно, и парень был очень мил».
Поскольку answer_text не является массивом, а просто приводится как объект с атрибутами, удалите круглые скобки и попробуйте сделать это следующим образом:
SELECT *,
JSON_EXTRACT_SCALAR(answers_text, '$.1261369621021236') AS q1 FROM raw_string
посмотрите на следующие 2 образца, которые я использовал, чтобы прийти к вышеуказанному выводу
SELECT JSON_EXTRACT_SCALAR(JSON '{ "name" : "Jakob", "age" : "6" }', '$.age') AS scalar_age;
SELECT json_extract_scalar('[1, 2, 3]', '$[2]');
Я не мог запустить это против presto. Меня беспокоит только то, что имя атрибута будет перепутано с большим целым числом. Я также задаюсь вопросом, почему у вас есть скобки вокруг значений. Это не должно быть необходимо для нормального json
Из документов json_extract_scalar
:
The value referenced by
json_path
must be a scalar (boolean, number or string):
Но у вас есть массив json, который не является скалярным значением, поэтому вам нужно либо указать путь к скалярному значению — '$.1261369621021236[0]'
:
-- data
WITH raw_string AS (
SELECT json '{"1261369621021236":["It was interactive and the guy was v nice"],
"4806456876149982":["Mediahub"]}' AS answers_text
)
-- query
SELECT JSON_EXTRACT_SCALAR(answers_text, '$.1261369621021236[0]') AS q1
FROM raw_string
Выход:
q1 |
---|
Это было интерактивно, и парень был очень мил. |
Или используйте JSON_EXTRACT
:
-- query
SELECT JSON_EXTRACT(answers_text, '$.1261369621021236') AS q1
FROM raw_string
Выход:
q1 |
---|
["Это было интерактивно, и парень был очень мил"] |
Также есть несколько вариантов использования приведения к разным типам. Например, при условии, что json может быть приведен к map(varchar, array(varchar))
, а значения могут быть извлечены по ключу и индексу массива (обратите внимание, что в предварительной версии начинается с 1):
SELECT cast(answers_text as map(varchar, array(varchar)))['1261369621021236'][1] AS q1
FROM raw_string
Спасибо Гуру. Я ценю источники, которые вы указали.
Спасибо Конрад за ваш комментарий. Ваше предложение убрать двойные кавычки не работает. Я читал источники, которые вы цитируете при решении этой проблемы. Я думаю, что решение может заключаться в том, чтобы сначала переименовать ключи из этих «больших чисел» во что-то вроде «question1», и они применяют приведенный выше код. Я думаю, что номера вопросов были автоматически сгенерированы в онлайн-опросе.