2013-09-10 2 views
0

Я хочу, чтобы выбрать номер, который начинается либо с 36 или 375, но не другие в этой таблице:Выбрать строки, который соответствует набор префиксов

+-------------+ 
| phone  | 
+-------------+ 
| 36000000000 | < 
| 37000000001 | 
| 36000000002 | < 
| 37500000002 | < 
| 34000000002 | 
| 33000000002 | 
+-------------+ 

Я попытался:

select phone from numbers where phone in ("36%", "375%"); 

но он возвращает пустой набор, я думаю, что подстановочный знак % не работает с функцией in

В моем случае у меня много префикса эс, чтобы проверить, поэтому я не использовал like оператор

+0

ли список префиксов в базе данных, или они жестко запрограммированы в запросе? – dcaswell

+0

ИСПОЛЬЗОВАНИЕ in не будет работать, как при выполнении буквального совпадения. Поэтому в «столбце в (1,2)» эквивалентно «(столбец = 1 или столбец = 2)». – rollcona

+0

@ user814064 Да, он жестко запрограммирован в запросе –

ответ

3

Вы можете сделать это с помощью одного регулярного выражения:

SELECT phone FROM numbers WHERE phone REGEXP '^(36*|375*)' 

, что по-прежнему требует некоторых операций (т.е. пересчет префиксов), но короче, чем OR LIKE синтаксис.

Теперь что касается индексов. Старая версия MySQL не будет использовать индекс для обоих случаев - OR LIKE (из-за OR) и REGEXP. Но новые версии (я протестировал на 5.5) будут использовать индекс для оба случая - см. this demo. Edit: может бытьOR LIKE будет использовать индекс в старой версии MySQL, чем REGEXP - что остается проверить (в комментариях ниже, мы обнаружили, что 5,1 версия используется индекс для OR LIKEREGEXP используется индекс 5.5.)

+0

@JoachimIsaksson LIKE будет использовать его, да (и только если он остается подстрочным, то есть LIKE '36% '), но OR LIKE не будет - даже если члены оставлены подстроками - это из-за ИЛИ в состоянии. Поэтому в этом случае REGEXP и OR LIKE совпадают. Чтобы быть более конкретным, новые версии MySQL могут справиться с этим (например, использовать индекс даже с 'OR LIKE'), но в общем случае - нет. –

+1

[EXPLAIN говорит мне, что это так) (http://sqlfiddle.com/#!8/b2018/1), и я бы вряд ли назвал 5.1 недавним :) –

+0

@JoachimIsaksson - да, это из-за новой версии MySQL , Я полагаю. Это также будет использоваться для REGEXP. 5.1 не очень старая версия (лучше проверить на 5.0.x) –

1

Используйте LIKE вместо IN:

SELECT phone FROM numbers WHERE phone LIKE "36%" OR phone LIKE "375%" 
+1

прочитал вопрос до конца; У меня есть множество префиксов для тестирования, я хочу использовать что-то маленькую строку 'IN' function –

+0

@GhilasBELHADJ Да, извините, я полностью прочитал это ... – PoByBolek

Смежные вопросы