2014-12-18 2 views
2

У меня есть «~» в моих json-полях, таких как «~ id». Используя Presto 0.75, я не могу получить доступ к таким полям. Ниже приводится то, что я пробовал до сих пор без успеха:Как получить доступ к полю json с именем «~» в имени поля с функциями Presto JSON

SELECT json_extract_scalar ('{"id": "1", "table": "test"}', '$ .table'); // Это работает

SELECT json_extract_scalar ('{"id": "1", "~ table": "test"}', '$. [\ "~ Table \"]'); // Не работает

SELECT json_extract_scalar ('{"id": "1", "~ table": "test"}', '$. [\ ~ Table]'); // Не работает

Ошибка приведенной здесь «Invalid JSON путь:»

+1

Вы пытаетесь '' $ [~ table] ''или'' $ ["~ table"] ''? – Grundy

ответ

4

Правильная форма для этого JSON путь является: '$["~table"]':

presto> SELECT json_extract_scalar('{"id":"1","~table":"test"}', '$["~table"]'); 

_col0 
------- 
test 
(1 row) 

Вот некоторые факты, которые помогут вам понять, почему альтернативы, которые вы пробовали, не работают:

  • Выражение пути JSON представлено строкой SQL. Единственный символ, который нуждается в экранировании, - это разделитель строк (т. Е. Одинарная кавычка), и способ, которым вы это делаете, - это с помощью одной отдельной цитаты. Например: 'don''t' - это строковый литерал SQL для don't. Двойные кавычки в строковом литерале SQL не обязательно должны быть экранированы.
  • Выражения пути JSON поддерживают две формы для доступа к атрибутам: доступ к полю vs для элемента массива. Если у вас есть атрибут с именем «foo», вы можете получить к нему доступ либо '$["foo"]', либо '$.foo'. Синтаксис доступа к полю работает только для имен, которые являются действительными идентификаторами (буквенно-цифровые и подчеркивания).
+0

Спасибо, Мартин. У меня были другие неудачные попытки, которые покрывали первый пункт, но у меня не было второго момента. Спасибо за объяснение. – user2793510

+0

То же понятие применяется и для символа «-» дефиса или тире. Я столкнулся с аналогичной проблемой в AWS Athena, которая опирается на функции presto json. –

Смежные вопросы