如何在SQL中查询具有位置的多个子字符串?

时间:2018-08-19 14:46:16

标签: sql presto

我有以下查询:

select position( '/s/' in col)
from table

这有效。

现在,我希望能够找到/s//d//c/的位置

我尝试过:

select position( '[/s/][/c/][/d/]' in col)
from table

但是它返回了错误的值。

示例:

select position( '/s/' in '/s/')

返回1。

select position( '[/s/][/d/][/c/]' in '/s/')

返回0

我该如何解决?

编辑:

  • 它只能包含/s//d//c/中的一个。该字符串将不包含/s/d/等...

  • 匹配的子字符串最多只能出现一次。该字符串将不包含'/s/..../s/'

简单来说-我正在寻找/s/ or /d/ or /c/的第一次出现,不用担心边缘情况。

2 个答案:

答案 0 :(得分:2)

这可能会达到目的:

SELECT MAX(patlist.pattern) FROM (VALUES (POSITION('/s/' IN col)), (POSITION('/d/' IN col)), (POSITION('/c/' IN col))) AS patlist(pattern)

包裹在查询中:

SELECT (SELECT MAX(patlist.pattern) FROM (VALUES (POSITION('/s/' IN col)), (POSITION('/d/' IN col)), (POSITION('/c/' IN col))) AS patlist(pattern))
FROM MyTable

免责声明:在没有prestodb实例的情况下,我只能在备用数据库引擎上对其进行测试。它可能在prestodb上起作用或不起作用。

答案 1 :(得分:1)

由于您在评论中写道,只有一个子字符串会出现,并且position()返回0,如果找不到该子字符串,您只需检查多个{{ 1}} s。

position()

或更妙的是,由于Presto具有SELECT position('/s/' in col) + position('/d/' in col) + position('/c/' in col) FROM table; 功能,您可以这样做:

greatest()

就像您获得最大的职位一样。