Sql 从列中提取数字

Sql 从列中提取数字,sql,postgresql,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 因

我有一个表
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%'

但这只给了我列中的第一个数字。有人能帮我查询一下吗。

如果链接中除了突出显示的数字之外没有其他数字,那么这应该可以工作:

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;

Working fiddle

您需要删除WHERE子句,因为您不想过滤掉这些行。您可以创建一个CASE语句,然后执行IF#XY的逻辑,然后查找索引或其他任何内容,去掉其他数字IF#XY和#AB,然后查找字符串中的#AB部分,并获取后面的字符,该字符可以作为索引处的子字符串。