微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 PostGreSQL 11.0 中的列中提取特定字段

如何解决从 PostGreSQL 11.0 中的列中提取特定字段

我在 Postgresql 11.0 中有以下列

col1                        start     end 
Q13563:p.I853A              853       853
P12004:p.[R5A;K110A]        5         5 
P12004:p.[R5A;K110A]        110       110 
P13569:p.N1303K             1303      1303 
P14770:p.S142_W143delinsGS  142       143 

我想应用正则表达式按以下顺序提取以下字段。

col1                        start     end      col2
Q13563:p.I853A              853       853      p.I853A
P12004:p.[R5A;K110A]        5         5        p.R5A
P12004:p.[R5A;K110A]        110       110      p.K110A
P13569:p.N1303K             1303      1303     p.N1303K
P14770:p.S142_W143delinsGS  142       143      p.S142_W143delinsGS

我正在使用以下正则表达式来提取所需的信息。

CASE 
     WHEN start = "end" AND col1 LIKE '.*:p.[A-Z\d+]+' 
     THEN 'p.'||(regexp_match(col1,'([A-Z]'||start||'[A-Z])'))[1] 
     ELSE col1
END AS col2,

上面的正则表达式也匹配了':p'之前的字母。我怎样才能达到预期的输出

非常感谢任何帮助。

解决方法

您的主要问题是,为了以“类似”的方式使用正则表达式,您需要使用 ~,而不是 LIKE

然后,在您的 ~ 语句中,您需要搜索数字范围 0-9\d+ 不会将其剪切到那些方括号内。此外,您应该匹配方括号字符(因此 \[\])。

最后,在 else 部分,您还应该使用模式进行搜索,而不仅仅是返回整列。否则你会在 'p.' 之前得到这些东西。

case 
    when start = "end" and col1 ~ '.*:p.[\[\]A-Z0-9]+' 
    then 'p.'||(regexp_match(col1,'([A-Z]'||start||'[A-Z])'))[1]
    else (regexp_match(col1,'p\..*'))[1]
    end as col2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。