从列中提取编号

时间:2018-09-25 07:59:50

标签: sql postgresql

我有一个表Job,其中列Comment包含以下数据:

-#AB1 #XY: https://xxxxxxxxxx/xxx/xxx/xxxxxxxx/12345/xxxxxxx
-#XY: https://xxxxxxx/xxx/xxx/xxxxxxxx/23456/xxxxx #AB2
-#XY: https://xxxxxxxxxx/xxx/xxx/xxxxxxxx/34567/xxxx
-#XY: https://xxxxxxxx/xxx/xxx/xxxxxx/45677/xxxxxxxx

因此,如果注释列中的#XY中有编号,应在链接(https://xxxxxxxxxx/xxx/xxx/xxxxxxxx/12345/xxxxxxx)中给我编号。

如果该列中同时包含#XY和#AB,则应该在#AB附近给我一个数字。

我用过:

SELECT substring(comment FROM '[0-9]+') AS original_id,
FROM job
WHERE internal_comment LIKE '%AB%'

但是,这仅是列中第一个数字。有人可以帮我这个查询吗?

1 个答案:

答案 0 :(得分:1)

假设链接中除突出显示的数字外没有其他数字,这应该可以工作:

SELECT 
/* match in any order */
CASE WHEN comment ~ '(#AB.*#XY)|(#XY.*#AB)'
/* match #AB{ any digits } and get only the number */
THEN (REGEXP_MATCHES(Comment, '(#AB)(\d+)'))[2]
/* find the digits in the link */
ELSE (REGEXP_MATCHES(comment, '\d+'))[1] END AS original_id
FROM job;

工作小提琴here