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

如何在SQL中查询具有位置的多个子字符串?,sql,presto,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 我怎样才能解

我有以下疑问:

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

这可能会起作用:

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
,如果找不到该子字符串,您只需检查多个子字符串的总和

或者更好,因为Presto有一个
best()
函数,您可以:

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

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

因为你在评论中写到,只有一个子串会出现并且
position()
返回
0
,如果没有找到子串,你只需要检查多个子串的和

或者更好,因为Presto有一个
best()
函数,您可以:

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

这样你就得到了最好的位置。

@a_horse_,没有名字prestodb在亚马逊上运行。如果
col
同时包含
/s/
/d/
,会怎么样?如果有多个匹配项,返回哪个位置重要吗?@RuudHelderman不会。它只能包含其中一个。这是契约,它只包含一次这样的事件。你确定你可以在那里使用模式吗?如果是,请尝试
位置('/s/|/d/|/c/'in'/s/')
@stickybit不起作用。我需要一种方法使其工作,而不是为每个子系统编写不同的职位查询:(@a_horse_和_no_name prestodb在亚马逊上运行。如果
col
同时包含
/s/
/d/
,如果有多个匹配项,返回哪个位置重要吗?@RuudHelderman它不会。它只能包含其中一个。契约中只包含一个这样的匹配项。你确定可以使用patte吗rns是否存在?如果是,请尝试
position('/s/|/d/|/c/'in'/s/')
@stickybit不起作用。我需要一种方法使它起作用,而不是为每个子sring编写不同的位置查询:(是的,我想到了这个解决方案,但想知道是否有办法避免多个位置查询..我有15篇论文:(是的,我想到了这个解决方案,但我想知道是否有办法避免多重职位查询..我有15篇论文:(