Подтвердить что ты не робот

SQL - объединение нескольких похожих запросов

Эй мой первый вопрос о СО! Anywho...

По-прежнему относительно новыйb на SQL, поэтому я думаю, что я мог бы что-то упустить. Мой вопрос: у меня в настоящее время есть таблица, полная телефонных номеров. Я хочу получить запрос, где я ищу номера телефонов, похожие на список, который у меня есть. Например, я хочу найти номера телефонов, которые начинаются с "555123", "555321" и "555987". Обычно я знаю, что если у вас есть список номеров, вы можете просто выполнить запрос, например

SELECT * 
  FROM phonenumbers 
 WHERE number in ('5551234567', '5559876543', .... );

Есть ли способ сделать это с подобным? Например,

SELECT * 
  FROM phonenumbers 
 WHERE number in like ('555123%', '555321%', '555987%'); //I know this doesn't actually work

Вместо того, чтобы делать это индивидуально

SELECT * 
  FROM phonenumbers 
 WHERE number like '555123%' 
    or number like '555321%' 
    or number like '555987%'; //Which does work but takes a long time

Или проще ли это сделать, что я просто отсутствую? Я использую postgres, я не знаю, есть ли там какие-либо команды, которые могли бы помочь в этом. Спасибо!

4b9b3361

Ответ 1

Вы можете использовать SIMILAR TO и разделить теги на | труба '555123%|555321%|555987%'

например:

SELECT * 
FROM phonenumbers 
WHERE number SIMILAR TO '555123%|555321%|555987%'

Ответ 2

Поздно к партии, но для процветания... Вы также можете использовать ANY (выражение массива)

SELECT * 
FROM phonenumbers 
WHERE number LIKE ANY(ARRAY['555123%', '555321%', '555987%'])

Ответ 3

Предполагая, что все ваши номера не содержат букв:

SELECT  number
FROM    (
        VALUES
        ('555123'),
        ('555321'),
        ('555000')
        ) prefixes (prefix)
JOIN    phonenumbers
ON      number >= prefix
        AND number < prefix || 'a'

Это будет использовать индекс на phonenumbers, если он есть.

Ответ 4

Я так не думаю, но вы могли бы присоединиться к phonenumbers в таблице criteria, содержащей значения, которые вы хотите сопоставить, т.е.

JOIN criteria ON phonenumbers.number LIKE criteria.phonenumbers

... возможно, не стоит этого для небольшого числа условий, хотя

Ответ 5

Возможно, если ваши префиксы имеют одинаковую длину, вы можете сделать where RIGHT(number) in ('123456', '234456', 'etc', 'etc')

Ответ 6

Вы также можете полагаться на регулярные выражения POSIX, см. раздел 9.7.3 официальной документации .

Например:

SELECT * FROM foobar WHERE name ~ '12345|34567';

Важно отметить, что ваше поле name имеет строковый тип.