Redshift提取两种模式之间的字符串(regexp_substr)

时间:2018-06-13 15:43:18

标签: sql regex amazon-redshift

我试图提取deviceSerialNumber=之后的文本,直到&或字符串结尾。数据看起来像

  

someddata&安培; =&somedataagain放大器; deviceSerialNumber = device12345&安培; anotherField = MOREDATA   someddata&安培; =&somedataagain放大器; deviceSerialNumber = deviceabcd

我试过这个

REGEXP_SUBSTR(session_tags || '&', 'deviceSerialNumber(.*)&') from table

但是,这将返回所有文本,直到最后的&(这是字符串的结尾,因为我为了模式匹配目的而附加&)。如何修改此正则表达式以仅提取文本,直到第一个&

4 个答案:

答案 0 :(得分:1)

我知道现在响应已经晚了,但这是对我有用的解决方案。

select regexp_substr('someddata&= somedataagain&deviceSerialNumber = device12345&anotherField = moreData','deviceSerialNumber =(。*)&',0,1,'e');

答案 1 :(得分:0)

使用出现参数

REGEXP_SUBSTR(session_tags, 'deviceSerialNumber=(.+?)&',1,1) from table

或者

REGEXP_SUBSTR(session_tags,(?<=deviceSerialNumber=)(.*?)(?=&)) from table

.*将匹配到最后一个&amp;并且.*?将匹配到第一个&amp;

答案 2 :(得分:0)

我遇到了与Invalid preceding regular expression prior to repetition operator相同的regexp_substr

我最终选择的解决方案是两个嵌套的split_part

select
params, 
split_part(split_part(params, 'deviceSerialNumber=', 2), '&', 1)
from (
    select 'someddata&=somedataagain&deviceSerialNumber=device12345&anotherField=moreData' as params
    union all
    select 'someddata&=somedataagain&deviceSerialNumber=deviceabcd' as params
) tmp

答案 3 :(得分:-1)

找到一个涉及两级查询的黑客解决方案,以便使用regexp_subtr。内部查询使用substringposition来提取deviceSerialNumber标记之后的所有文本。外部查询使用相同的两个函数来切断下一个&

之后的任何文本
select substring(pre_serial_num, 1, position('&' in pre_device_id || '&') - 1) as device_id
from
    (select substring(session_tags,position('deviceSerialNumber' in session_tags) + 20, 40) as pre_device_id 
    from table) a

例如内部查询需要

  

someddata&amp; = somedataagain&amp; deviceSerialNumber = device12345&amp; anotherField = moreData

     

someddata&安培; =&somedataagain放大器; deviceSerialNumber = deviceabcd

并在设备序列号标签前删除文本以便

  

device12345&amp; anotherField = moreData

     

deviceabcd

第二个查询然后在设备序列号标签后删除文本

  

deviceSerialNumber = device12345

     

deviceSerialNumber = deviceabcd