2009-04-29 4 views
14

Так,MySQL Wildcard для "=" - там один

SELECT * FROM table WHERE col LIKE '%' 

возвратит все. Есть ли символ для запроса

SELECT * FROM table WHERE col = '*' 

Ясно * не работает, я просто положил его там, чтобы указать, где я хотел бы уайлдкард. Выбранный столбец содержит целое число от 1 до 12, и я хочу иметь возможность выбирать либо все записи с определенным номером, либо все записи с подстановочным знаком.

Спасибо,

ответ

11

LIKE в основном то же самое, что и =, за исключением того, что LIKE позволяет использовать подстановочные знаки.

Эти два запроса будут возвращать те же результаты:

SELECT * FROM table WHERE col LIKE 'xyz'; 
SELECT * FROM table WHERE col='xyz'; 

Без «%» в LIKE запросе, это фактически то же самое, как «=».

Если вы делаете выделение на целочисленном столбце, вам следует рассмотреть возможность использования операторов IN() или BETWEEN. Похоже, что у вас есть два отдельных условия, которые нужно обрабатывать в коде, а не в запросе, так как ваши условия диктуют, что вам нужны как минимум два разных типа запросов.

Редактировать: Я должен уточнить, что LIKE и = аналогичны только в обычном, обычном использовании сравнения строк. Вы должны проверить MySQL Manual на предмет того, как это работает, поскольку есть ситуации, когда это не то же самое (например, языковые наборы).

+0

Спасибо, именно то, что я искал. Будет обрабатывать его в коде и изменять запрос, чтобы включить это конкретное предложение WHERE, если и когда это необходимо. – Dan

+0

Поддерживает ли MySQL МЕЖДУ? Я думал, что это просто TSQL –

+0

@Joe: BETWEEN - это стандартный SQL. Я никогда не встречал ни одной системы, поддерживающей SQL, которая не поддерживает BETWEEN. –

7

Причина использования LIKE потому, что = не предлагает поддержку подстановочных. В противном случае не было бы причин для LIKE

0
SELECT * FROM table WHERE col RLIKE '.*' 

i.e регулярное выражение LIKE.

+0

Спасибо, что напомнили мне об этом хорошем операторе MySQL. RLIKE aka REGEXP стоит знать: http://dev.mysql.com/doc/refman/5.1/en/regexp.html – artlung

8

Если вы хотите выбрать все, то почему вы присоединяете предложение WHERE? Просто оставьте это условно вместо того, чтобы вставлять в него подстановочный знак.

+1

Я думал, что тогда я подумал, что нет, это бессмысленно, он должен просто использовать подстановочный знак в качестве примера и на самом деле он будет привязывать текст по одной или обеим сторонам. Затем я подробно перечитываю вопрос и нет, вы правы, ему просто нужно оставить ГДЕ для его заявления. – chaos

+1

Дэн, вы знаете, что часть WHERE является необязательной, не так ли? Если вы оставите это, вы выберете каждую строку. – allyourcode

0

Предполагая, что ваш запрос параметр приводится тематическое заявление, вероятно, подходит

select * from mytable 
where col like case when @myvariable is null then % else myvariable end 

Где @myvariable либо нулевое значение, если вы не хотите, значение в противном случае он будет использовать целочисленное значение, которое пройдет в.

0

Ответ зомбата велик, но я только заметил в его ответе, что вы выбираете целые числа. Он упомянул IN() и BETWEEN(). Вот примеры использования этих синтаксисов, а также некоторые другие параметры, которые у вас есть для целочисленного поля.

SELECT * FROM table WHERE col = 1; 
SELECT * FROM table WHERE col BETWEEN 1 AND 12; 
SELECT * FROM table WHERE col BETWEEN 6 AND 12; 
SELECT * FROM table WHERE col <= 6; 
SELECT * FROM table WHERE col < 6; 
SELECT * FROM table WHERE col >= 6; 
SELECT * FROM table WHERE col > 6; 
SELECT * FROM table WHERE col <> 6; 
SELECT * FROM table WHERE col IN (1,2,5,6,10); 
SELECT * FROM table WHERE col NOT IN (1,2,5,6,10); 
0

Я сталкивался с такой случай, при построении хранимой процедуры для отчета После мое решение, надеюсь, что это то, что вы имели в виду :)

set @p = "ALL"; 

Запрос:

select * from fact_orders 
where 
dim_country_id = if(@p is null or @p="ALL", dim_country_id, @p) 
limit 10 
; 
0

Если ваши значения находятся в диапазоне (1,12), то:

выбрать * fro m стол, где col> = 5 и col < = 5; // это равно col = 5

выберите * из таблицы, где col> = 0 и col < = 12; // это равно col = любое значение

В той же строке можно произвести оба эффекта, выбрав соответствующие 2 параметра. Я столкнулся с аналогичной проблемой, когда мне нужен был один подготовленный оператор, который должен работать с двумя разными способами: либо проверять конкретное значение в столбце, либо полностью игнорировать этот столбец.