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