SQL - объединение нескольких похожих запросов - PullRequest
25 голосов
/ 11 февраля 2010

Эй, мой первый вопрос о ТАК! Anywho ...

По-прежнему относительно новичок в 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, я не знаю, есть ли какие-нибудь команды, которые бы помогли с этим. Спасибо!

Ответы [ 6 ]

34 голосов
/ 11 февраля 2010

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

например:

SELECT * 
FROM phonenumbers 
WHERE number SIMILAR TO '555123%|555321%|555987%'
24 голосов
/ 19 ноября 2014

Поздно к вечеринке, но для потомков ... Вы также можете использовать ЛЮБОЙ (выражение массива)

SELECT * 
FROM phonenumbers 
WHERE number LIKE ANY(ARRAY['555123%', '555321%', '555987%'])
6 голосов
/ 11 февраля 2010

Предполагая, что все ваши номера не содержат букв, а ваши цифры всегда являются "префиксами" (например: LIKE '123%'):

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

При этом будет использоваться индекс phonenumbers, если таковой имеется, поэтому может быть быстрее.

3 голосов
/ 11 февраля 2010

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

JOIN criteria ON phonenumbers.number LIKE criteria.phonenumbers

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

1 голос
/ 11 февраля 2010

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

0 голосов
/ 06 октября 2013

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

Например:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...