如何在PostgreSQL中找到多个子字符串的位置?

时间:2018-08-20 06:19:29

标签: sql postgresql

我有一个这种类型的字符串:

URL/X/help?

X代表字符,例如:a,b,c等。该位置只有一个字符。 URL的长度未知,可以是:www.website.comwww.website.co.ukwww.website.info等...

我想找出/X/在字符串中的位置,但前提是X是:s,b,t

/ X /-在字符串中仅出现一次。

类似的东西:

select position ('/s/' or '/b/' or '/t/' in URL)

但这不是PostgreSQL语法。

除了执行以下操作之外,是否有其他方法可以编写此查询:

select position ('/s/' in URL) + 
select position ('/b/' in URL) +
select position ('/t/' in URL)

编辑: 没有复杂的案例。无需担心/s/s/b//s//s/g//s/..../s/等……只是我介绍的简单案例。它还保证/CHAR/只会出现一次,但字符是未知的。

1 个答案:

答案 0 :(得分:2)

由于您想知道是否可以使用正则表达式来完成此操作,所以这里是一个:

select 
  coalesce(nullif(length(regexp_replace(url, '\/[sbt]\/.*', '')), length(url))+1, 0) as pos
from ( select 'www.webexample.com/s/help?' as url union all
       select 'www.webexample.com/d/help?' as url ) t;

输出:

| pos |
+-----+
| 19  |
| 0   |

它如何工作?

  1. 使用regexp_replace查找并替换从/s//b//t/开始的字符串部分,直到字符串末尾带有空白字符''
  2. 计算结果的length,以查看/之前最后一个字符的位置
  3. 应用nullif函数,如果字符串替换后的URL长度等于原始URL的长度,则返回NULL
  4. 添加+1,以获取斜杠的位置,该斜杠的位置恰好来自类[sbt]
  5. 应用coalesce函数,将NULL的值转换为0

感谢@Abelisto输入