在 Redshift SQL 中从数组中提取值
Posted
技术标签:
【中文标题】在 Redshift SQL 中从数组中提取值【英文标题】:Extracting Values from Array in Redshift SQL 【发布时间】:2016-02-06 15:40:12 【问题描述】:我有一些数组存储在 Redshift 表“事务”中,格式如下:
id, total, breakdown
1, 100, [50,50]
2, 200, [150,50]
3, 125, [15, 110]
...
n, 10000, [100,900]
由于这种格式对我没用,我需要对此进行一些处理以获取值。我已经尝试使用正则表达式来提取它。
SELECT regexp_substr(breakdown, '\[([0-9]+),([0-9]+)\]')
FROM transactions
但我收到一个错误,上面写着
Unmatched ( or \(
Detail:
-----------------------------------------------
error: Unmatched ( or \(
code: 8002
context: T_regexp_init
query: 8946413
location: funcs_expr.cpp:130
process: query3_40 [pid=17533]
--------------------------------------------
理想情况下,我希望将 x 和 y 作为它们自己的列,以便进行适当的数学运算。我知道我可以在 python 或 php 等中相当容易地做到这一点,但我对纯 SQL 解决方案感兴趣 - 部分原因是我使用在线 SQL 编辑器(模式分析)将其轻松绘制为仪表板。
感谢您的帮助!
【问题讨论】:
【参考方案1】:如果breakdown
真的是一个数组,你可以这样做:
select id, total, breakdown[1] as x, breakdown[2] as y
from transactions;
如果故障 不是 一个数组,而是例如varchar
列,如果将方括号替换为大括号,则可以将其转换为数组:
select id, total,
(translate(breakdown, '[]', '')::integer[])[1] as x,
(translate(breakdown, '[]', '')::integer[])[2] as y
from transactions;
【讨论】:
【参考方案2】:你可以试试这个:
SELECT REPLACE(SPLIT_PART(breakdown,',',1),'[','') as x,REPLACE(SPLIT_PART(breakdown,',',2),']','') as y FROM transactions;
我用 redshift db 试过这个,这对我有用。
详细说明:
SPLIT_PART(breakdown,',',1)
会给你[50
。
SPLIT_PART(breakdown,',',2)
会给你50]
。
REPLACE(SPLIT_PART(breakdown,',',1),'[','')
将替换 [
并仅提供 50
。
REPLACE(SPLIT_PART(breakdown,',',2),']','')
将替换 ]
并仅提供 50
。
【讨论】:
【参考方案3】:知道它是一个旧帖子。但是如果有人需要更简单的方法
select json_extract_array_element_text('[100,101,102]', 2);
输出:102
【讨论】:
以上是关于在 Redshift SQL 中从数组中提取值的主要内容,如果未能解决你的问题,请参考以下文章
Redshift - 在 where 子句中从 csv 传递值