如何解决从 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 举报,一经查实,本站将立刻删除。