Amazon Redshift получает все ключи от JSON - PullRequest
1 голос
/ 04 октября 2019

Я посмотрел документацию по Amazon redshift и не смог увидеть функцию, которая выдаст мне то, что я хочу.

https://docs.aws.amazon.com/redshift/latest/dg/json-functions.html

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

{'en_IN-foo': 'bla bla', 'en_US-foo': 'bla bla'}

Я хочу извлечь все ключи из json, которыеесть фу. Поэтому я хочу извлечь

en_IN-foo en_US-foo

Как я могу получить то, что я хочу? Наиболее близким к моему требованию является функция JSON_EXTRACT_PATH_TEXT, но она может извлечь ключ только тогда, когда вы знаете его имя. в моем случае мне нужны все ключи, у которых есть шаблон, но я не знаю их имен.

Я также попытался отказаться от функции JSON и перейти на путь REGEX. Я написал этот код

select distinct regexp_substr('{en_in-foo:FOO, en_US-foo:BAR}','[^.]{5}-foo')

, но он находит только первое совпадение. Мне нужны все спички.

1 Ответ

2 голосов
/ 05 октября 2019

Redshift не является гибким с JSON, поэтому я не думаю, что получение ключей из произвольного документа JSON возможно. Вам необходимо знать ключи заранее.

опция 1

Если возможно, измените ваш документ JSON на статическую схему:

{"locale":"en_IN", "foo": "bla bla"}

Или даже

{"locale":"en_IN", "name": "foo", "value": "bla bla"}

Вариант 2

Я вижу, что ваш префикс может быть известен вам как он выглядит как локаль. Что вы можете сделать, это создать статическую таблицу локалей, а затем CROSS JOIN ее со столбцом JSON.

locales_table:

Id | locale
----------------
1  |  en_US
2  |  en_IN

Запрос будет выглядеть следующим образом:

SELECT
   JSON_EXTRACT_PATH_TEXT(json_column, locale || '-foo', TRUE) as foo_at_locale
FROM json_table 
  CROSS JOIN locales_table
WHERE foo_at_locale IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...