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



我有以下查询:

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/不必担心边缘情况。

这可能会解决问题:

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上工作,也可能不起作用。

由于您在注释中写道,只有一个子字符串将存在并且position()返回0,如果找不到子字符串,您只需检查多个position()的总和。

SELECT position('/s/' in col)
+
position('/d/' in col)
+
position('/c/' in col)
FROM table;

甚至更好的是,由于Presto具有greatest()功能,因此您可以执行以下操作:

SELECT greatest(position('/s/' in col),
position('/d/' in col),
position('/c/' in col))
FROM table;

这样,你得到了最大的位置。

相关内容

  • 没有找到相关文章

最新更新