Amazon Redshift 从 JSON 获取所有密钥

Posted

技术标签:

【中文标题】Amazon Redshift 从 JSON 获取所有密钥【英文标题】:Amazon Redshift get all keys from JSON 【发布时间】:2019-10-03 23:46:08 【问题描述】:

我查看了 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 中提取所有具有 foo 的键。所以我要提取

zh_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】:

Redshift 对 JSON 不灵活,所以我认为从任意 JSON 文档中获取密钥是不可能的。您需要预先知道密钥。

选项 1

如果可能,将您的 JSON 文档更改为具有静态架构:

"locale":"en_IN", "foo": "bla bla"

甚至

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

选项 2

我可以看到您的前缀可能是为您所知,因为它看起来像语言环境。您可以做的是创建一个静态语言环境表,然后使用您的 JSON 列CROSS JOIN

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

【讨论】:

以上是关于Amazon Redshift 从 JSON 获取所有密钥的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Redshift 使用 COPY 命令仅从 JSON 中获取 1 行

从 Amazon Redshift 中的 json 数组中提取特定键

使用 Amazon Redshift 从 Python psycopg2 中的游标获取大于 MAX INT 的行数

需要从源表中获取布尔类型列作为 varchar 并在 Amazon redshift 的目标表中存储为 varchar

Amazon redshift 在字符串正则表达式后获取数字

复制 json 文件时出现 Amazon Redshift 错误 - JSONPath 格式无效:成员不是对象