Как запросить несколько подстрок с позицией в 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/, не беспокойтесь о крайних случаях.

@a_horse_with_no_name prestodb работает на Amazon.

Programmer120 19.08.2018 17:12

Что, если col содержит как /s/, так и /d/? Имеет ли значение, в какую позицию возвращаться, если совпадений несколько?

Ruud Helderman 19.08.2018 17:16

@RuudHelderman не будет. Он может содержать только один из них. Это соглашение о том, что он содержит только одно такое появление.

Programmer120 19.08.2018 17:16

Вы уверены, что можете использовать там шаблоны? Если да, попробуйте position('/s/|/d/|/c/' in '/s/').

sticky bit 19.08.2018 17:34

@stickybit не работает. Мне нужен способ заставить его работать, кроме написания разных запросов позиции для каждой подстроки :(

Programmer120 19.08.2018 17:37

Вы просто хотите знать, есть ли там какие-либо подстроки или важно знать точное положение?

sticky bit 19.08.2018 17:39

@stickybit Один из них должен быть там (нет необходимости проверять), я просто хочу знать его положение.

Programmer120 19.08.2018 17:44
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
7
468
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

Ответ принят как подходящий

Поскольку вы написали в комментариях, что будет присутствовать только одна из подстрок, а 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 тезисов :(

Programmer120 19.08.2018 17:48

Другие вопросы по теме