使用 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,而不是一次一遍地创建)

将数据从 sql server 增量上传到 Amazon Redshift [关闭]