Amazon redshift Amazon红移从JSON获取所有密钥

Amazon redshift Amazon红移从JSON获取所有密钥,amazon-redshift,Amazon Redshift,我看了AmazonRedshift的文档,没有看到一个函数可以满足我的需求 我的数据库中有一列包含如下JSON {'en_IN-foo':'bla bla','en_US-foo':'bla bla'} 我想从json中提取所有包含foo的键。所以我想提取 恩仁福 恩美富 我怎样才能得到我想要的?与我的要求最接近的是JSON_EXTRACT_PATH_TEXT函数,但它只能在知道密钥名称时提取密钥。在我的例子中,我想要所有有模式的键,但我不知道键名 我还试着放弃JSON函数的方式,而采用正则表

我看了AmazonRedshift的文档,没有看到一个函数可以满足我的需求

我的数据库中有一列包含如下JSON

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

我想从json中提取所有包含foo的键。所以我想提取

恩仁福 恩美富

我怎样才能得到我想要的?与我的要求最接近的是JSON_EXTRACT_PATH_TEXT函数,但它只能在知道密钥名称时提取密钥。在我的例子中,我想要所有有模式的键,但我不知道键名

我还试着放弃JSON函数的方式,而采用正则表达式的方式。我写了这段代码

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

但这只能找到第一个匹配项。我需要所有匹配项。

红移对于JSON不灵活,因此我认为从任意JSON文档获取密钥是不可能的。你需要事先知道钥匙

选择1 如果可能,请将JSON文档更改为具有静态模式:

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

{"locale":"en_IN", "name": "foo", "value": "bla bla"}
选择2 我可以看出,您可能知道您的前缀,因为它看起来像语言环境。您可以做的是创建一个区域设置的静态表,然后用JSON列交叉连接它

locales\u表

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