使用 SQL 的 Amazon Redshift 中的正则表达式
Posted
技术标签:
【中文标题】使用 SQL 的 Amazon Redshift 中的正则表达式【英文标题】:Regex in Amazon Redshift using SQL 【发布时间】:2021-06-22 15:29:55 【问题描述】:我在亚马逊红移中使用 sql。我有一个名为属性的列,如下所示:
["name": "Size", "value": "Small","name": "Color", "value": "Blue","name": "Material", "value": "Cotton"]
或
["name": "Material", "value": "silk","name": "Color", "value": "Pink"]
为了提取材料值,我正在尝试使用正则表达式。我有这样的初始代码:
select REGEXP_SUBSTR(attributes,'Material.*') as string_value
结果:
Material", "value": "Cotton"]
和
Material", "value": "silk","name": "Color", "value": "Pink"]
我怎样才能更进一步,只获得材料的价值,所以输出应该看起来像:
Cotton
silk
我是 sql 新手和 regex 新手,非常感谢您的帮助。
【问题讨论】:
【参考方案1】:您可以使用正则表达式和捕获组:
select REGEXP_SUBSTR(attributes, '"Material", "value": "([^"]*)"') as string_value
【讨论】:
我将您的建议修改为:选择 REGEXP_SUBSTR(attributes, '"Material", "value": "([^"]*)"') as string_value , REGEXP_SUBSTR(string_value, ':. *') as material_value. 示例结果是:"Cotton" 我怎样才能删除 : 和两个 " 以得到棉花?谢谢!【参考方案2】:您可能不应该求助于使用正则表达式来解析 JSON 内容,尤其是考虑到您的 JSON 内容嵌套在数组中。诚然,我不是 Redshift JSON API 方面的专家,但 this SO question 非常有帮助。考虑以下方法:
CREATE VIEW seq_0_to_3 AS
SELECT 0 AS i UNION ALL
SELECT 1 UNION ALL
SELECT 2
);
WITH exploded_array AS (
SELECT id, JSON_EXTRACT_ARRAY_ELEMENT_TEXT(json_col, seq.i) AS json
FROM yourTable, seq_0_to_3 AS seq
WHERE seq.i < JSON_ARRAY_LENGTH(json_col)
)
SELECT JSON_EXTRACT_PATH_TEXT(json, 'value') AS Material
FROM exploded_array
WHERE JSON_EXTRACT_PATH_TEXT(json, 'name') = 'Material';
此答案假定您的 JSON 数组始终包含 3 个元素,分别表示大小、颜色和材质。如果计数与 3 不同,则使用正确数量的元素更新上面的视图 seq_0_to_3
。
【讨论】:
以上是关于使用 SQL 的 Amazon Redshift 中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 SQL Workbench/J 在 Amazon Redshift 中创建新用户
有用的 Amazon Redshift SQL 用户定义函数的任何示例?
在 SQL (Amazon Redshift) 中使用正则表达式提取标签
Postgres SQL (Amazon Redshift) 在启动时运行命令
如何使用SQL或Python在Amazon Redshift中从Amazon Snow雪花重新创建数据库表? (一次重新创建所有ot,而不是一次一遍地创建)