JSON Extract возвращает значения NULL

У меня есть образец моего набора данных, который выглядит так:

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

Почему это возвращает ноль? Я пытаюсь получить значение, которое в данном случае должно быть: «Это было интерактивно, и парень был очень мил».

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поскольку answer_text не является массивом, а просто приводится как объект с атрибутами, удалите круглые скобки и попробуйте сделать это следующим образом:

SELECT *,
JSON_EXTRACT_SCALAR(answers_text, '$.1261369621021236') AS q1 FROM raw_string

посмотрите на следующие 2 образца, которые я использовал, чтобы прийти к вышеуказанному выводу

Источник 1

SELECT JSON_EXTRACT_SCALAR(JSON '{ "name" : "Jakob", "age" : "6" }', '$.age') AS scalar_age;

Источник 2

SELECT json_extract_scalar('[1, 2, 3]', '$[2]');

Я не мог запустить это против presto. Меня беспокоит только то, что имя атрибута будет перепутано с большим целым числом. Я также задаюсь вопросом, почему у вас есть скобки вокруг значений. Это не должно быть необходимо для нормального json

Спасибо Конрад за ваш комментарий. Ваше предложение убрать двойные кавычки не работает. Я читал источники, которые вы цитируете при решении этой проблемы. Я думаю, что решение может заключаться в том, чтобы сначала переименовать ключи из этих «больших чисел» во что-то вроде «question1», и они применяют приведенный выше код. Я думаю, что номера вопросов были автоматически сгенерированы в онлайн-опросе.

Syb20 03.05.2022 04:10
Ответ принят как подходящий

Из документов 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

Спасибо Гуру. Я ценю источники, которые вы указали.

Syb20 03.05.2022 21:37

Другие вопросы по теме