Postgres查询以从给定文本中获取特定文本

时间:2018-09-10 11:38:00

标签: postgresql extract

我在一列的不同行中都有这样的文字

  • xxxxxxxxxxx ab_88_2018 xxxxxx
  • ab_88_2018 xxxxxx
  • AB_88_2018 xxxxxx
  • ab_2018_88 XXXXXX

因此,我只希望将88个文本插入另一列。 什么是查询?

不是88,但是那个位置有两个数字

1 个答案:

答案 0 :(得分:0)

88总是2位数字吗?如果是这样,这对Postgres和Redshift来说对我来说很有效,我相信可以为您提供所需的东西:

SELECT
CASE
  WHEN LOWER(column)
    ~ '.*[a-z]{2}\_[0-9]{2}\_[0-9]{4}.*' THEN SPLIT_PART(column,'_',2)
  WHEN LOWER(column)
    ~ '[a-z]{2}\_[0-9]{4}\_[0-9]{2}.*' THEN LEFT(SPLIT_PART(column,'_',3),2)
    END As get_two_digit_number

〜(波浪号)类似于LIKE,但允许您通过正则表达式进行模式匹配。请访问regexr.com,然后将示例和代码粘贴到''之间,以查看其匹配的内容

SPLIT_PART接受与模式匹配的字符串,然后在我选择的字符上将其断开,这里是'_'。最后一个数字是返回的休息时间

以'xxxxxxxxxxx ab_88_2018 xxxxxx'为例,SPLIT_PART('xxxxxxxxxxx ab_88_2018 xxxxxx','',2)将返回'88',因为88是''之后的第二部分。如果输入1,它将返回之前“ _”

的所有内容