Ответ 1
Вы можете использовать SIMILAR TO
и разделить теги на | труба '555123%|555321%|555987%'
например:
SELECT *
FROM phonenumbers
WHERE number SIMILAR TO '555123%|555321%|555987%'
Эй мой первый вопрос о СО! 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, я не знаю, есть ли там какие-либо команды, которые могли бы помочь в этом. Спасибо!
Вы можете использовать SIMILAR TO
и разделить теги на | труба '555123%|555321%|555987%'
например:
SELECT *
FROM phonenumbers
WHERE number SIMILAR TO '555123%|555321%|555987%'
Поздно к партии, но для процветания... Вы также можете использовать ANY (выражение массива)
SELECT *
FROM phonenumbers
WHERE number LIKE ANY(ARRAY['555123%', '555321%', '555987%'])
Предполагая, что все ваши номера не содержат букв:
SELECT number
FROM (
VALUES
('555123'),
('555321'),
('555000')
) prefixes (prefix)
JOIN phonenumbers
ON number >= prefix
AND number < prefix || 'a'
Это будет использовать индекс на phonenumbers
, если он есть.
Я так не думаю, но вы могли бы присоединиться к phonenumbers
в таблице criteria
, содержащей значения, которые вы хотите сопоставить, т.е.
JOIN criteria ON phonenumbers.number LIKE criteria.phonenumbers
... возможно, не стоит этого для небольшого числа условий, хотя
Возможно, если ваши префиксы имеют одинаковую длину, вы можете сделать where RIGHT(number) in ('123456', '234456', 'etc', 'etc')
Вы также можете полагаться на регулярные выражения POSIX, см. раздел 9.7.3 официальной документации .
Например:
SELECT * FROM foobar WHERE name ~ '12345|34567';
Важно отметить, что ваше поле name
имеет строковый тип.