提取单词和字符之间的字符串
Posted
技术标签:
【中文标题】提取单词和字符之间的字符串【英文标题】:Extract string between a word, and a character 【发布时间】:2020-04-29 23:48:33 【问题描述】:对于 PostgreSQL。
我有一个字符串,其中包含用于广告活动的元数据。
示例:
date:20200429-category:phones-audience:youth-promo:nooffer
我希望能够为每个键/对提取值,例如为类别列提取电话,为受众列提取青年。
编辑:
现在我在我做的地方有它:
split_part(split_part(example_string_field, 'category:',2),'-',1)
但是好像有点乱。
寻求帮助,谢谢。
【问题讨论】:
数据杂乱无章。你的解决方案很好。 Redshift 还是 Postgres?虽然它们有一些古老的根源,但它们是完全不同的产品 【参考方案1】:我认为你可以使用正则表达式:
regexp_substr(str, 'category:([^-])+', 1, 1, 'e')
【讨论】:
【参考方案2】:我基本同意 Bohemian 的观点,即您的解决方案很好,但您可以通过一些字符串操作将其传递到键值表中,这使得最后一步只是针对单个列的一组选择。使解析新列更容易一些,只需在 crosstabbed_data 中添加另一行。
testdb=# with input_rows as (
select 'date:20200429-category:phones-audience:youth-promo:nooffer' as data
UNION ALL
select 'date:20200430-category:tablet-audience:olds-promo:offer'
),
eav_data as (
SELECT rownum, k_v[1] part, k_v[2] val
FROM
(
SELECT rownum, string_to_array(item, ':') AS k_v
FROM (select rownum, unnest(items) as item from (
select row_number() over () as rownum, string_to_array(data, '-') as items from input_rows)_0
)_1 )_2
),
rownums as (select rownum as num from eav_data group by rownum),
crosstabbed_data as (
select
(select val from eav_data where rownum=num and part='date') as date,
(select val from eav_data where rownum=num and part='category') as category,
(select val from eav_data where rownum=num and part='audience') as audience,
(select val from eav_data where rownum=num and part='promo') as promo
from rownums)
select * from crosstabbed_data;
date | category | audience | promo
----------+----------+----------+---------
20200429 | phones | youth | nooffer
20200430 | tablet | olds | offer
(2 rows)
【讨论】:
以上是关于提取单词和字符之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章