我有以下查询:
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/
的第一次出现,不用担心边缘情况。
答案 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()
就像您获得最大的职位一样。