从字段 sql/presto 中提取子字符串

Posted

技术标签:

【中文标题】从字段 sql/presto 中提取子字符串【英文标题】:Extract substrings from field sql/presto 【发布时间】:2019-12-21 17:11:07 【问题描述】:

我的数据库中有列包含由 / 分隔的值。我正在尝试从列中提取某些值并用它们创建新行。

数据示例如下所示;

user/values2/class/year/subject/18/9/2000291.csv
holiday/booking/type/1092/1921/1.csv
drink/water/juice/1/232/89.json
drink/water1/soft/90091/2/89.csv
car/type/1/001/1.json
game/mmo/1/2/3.json

我想从数据中提取最后 3 个数字,例如,来自

user/values2/class/year/subject/18/9/2000291.csv

我想要

x = 18
y = 9
z = 200291

并在表格中显示这些是新字段。

我一直在研究和使用 presto 查询,但不知道如何实现我想要的。我在下面编写了查询,但无法正常工作。

SELECT origin
         split_part(origin, '.' & '/', 1) as z,
         split_part(origin, '.' & '/', 2) as y,
         split_part(origin, '.' & '/', 3) as x,
FROM "data_customer";

已编辑

当前表

期望的结果

【问题讨论】:

【参考方案1】:

Presto 代码:

with your_data as(
select * from (values
'user/values2/class/year/subject/18/9/2000291.csv',
'holiday/booking/type/1092/1921/1.csv',
'drink/water/juice/1/232/89.json',
'drink/water1/soft/90091/2/89.csv',
'car/type/1/001/1.json',
'game/mmo/1/2/3.json'
)s (origin)
)

select s.origin, origin_splitted[3] x, origin_splitted[2]  y, regexp_extract(origin_splitted[1],'\d*') z
from
(
select s.origin, reverse(split(s.origin,'/')) origin_splitted from your_data s
)s

结果:

origin  x   y   z
user/values2/class/year/subject/18/9/2000291.csv    18  9   2000291
holiday/booking/type/1092/1921/1.csv              1092  1921    1
drink/water/juice/1/232/89.json                      1  232 89
drink/water1/soft/90091/2/89.csv                 90091  2   89
car/type/1/001/1.json                              1    1   1
game/mmo/1/2/3.json                                1    2   3

如有必要,将相同的 regexp_extract 应用于 x 和 y 列,或者可以应用另一个拆分来代替 regexp_extract,希望你明白了

【讨论】:

原点是一个字段名称,它在不同的列中包含这些值。抱歉应该说清楚。 您好,很抱歉耽搁了,请参阅已编辑的会话。我希望它更有意义。 @Adamkhan 它有什么不同?你能解释一下吗?看起来你有 origin 列,你需要从中提取值,我做的完全一样。只需将 my your_data CTE 替换为您的表格,瞧 with data_customer as( select * from (values)s (origin)) 我是否应该只从值中选择而不放置正在进行的数据,例如'user/values2/class/year/subject/18/9/2000291.csv' @Adamkhan \d in regexp 表示数字。

以上是关于从字段 sql/presto 中提取子字符串的主要内容,如果未能解决你的问题,请参考以下文章

PB中取字符串子串的函数是啥

使用 Python 的字符串子序列内核和 SVM

如何更改python字符串子字符串信息

[在python中使用正则表达式搜索字符串子字符串

Java使用正则表达式提取字段分隔的子字符串

求字符串不同子串个数