提取单词和字符之间的字符串

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)

【讨论】:

以上是关于提取单词和字符之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 Excel 中的 2 列之间提取部分匹配字符串(单词)

如何使用 sed/grep 提取两个单词之间的文本?

从字符串中提取单词

c ++如何提取单词之间的空格(如果有的话)

Pandas DataFrame - 在两个字符串之间提取字符串并包含第一个分隔符

python编程题 提取首字符?