У меня такой запрос:
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/, не беспокойтесь о крайних случаях.
Что, если col содержит как /s/, так и /d/? Имеет ли значение, в какую позицию возвращаться, если совпадений несколько?
@RuudHelderman не будет. Он может содержать только один из них. Это соглашение о том, что он содержит только одно такое появление.
Вы уверены, что можете использовать там шаблоны? Если да, попробуйте position('/s/|/d/|/c/' in '/s/').
@stickybit не работает. Мне нужен способ заставить его работать, кроме написания разных запросов позиции для каждой подстроки :(
Вы просто хотите знать, есть ли там какие-либо подстроки или важно знать точное положение?
@stickybit Один из них должен быть там (нет необходимости проверять), я просто хочу знать его положение.


Это может помочь:
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;
Так вы получите высшую позицию.
Да, я подумал об этом решении, но хотел знать, есть ли способ избежать запросов с несколькими позициями .. У меня вроде 15 тезисов :(
@a_horse_with_no_name prestodb работает на Amazon.