2015-05-08 3 views
1

я застрял на проблему, когда моя колонка OFFER_DESCRIPTION содержит строку с Amount (Integer) .... напримерКак проверить точное целое значение в строковое MySQL

BUY ABOVE 200 

BUY ABOVE 900 

BUY ABOVE 300... 

Пользователь может запросить что-то вроде этого. .. предлагать для 200 ... тогда я запускаю запрос примерно так ...

выберите * из предложения, где OFFER_DESCRIPTION нравится '% 200%';

ИЛИ

ВЫБОР OFFER_DESCRIPTION ОТ offertable ГДЕ OFFER_DESCRIPTION RLIKE '200';

работает нормально, если есть только RS.200 предложение, но ... в другом сценарии ... где есть другой набор предложений, как ....

BUY ABOVE 200 

BUY ABOVE 1200 //NEW ONE 

BUY ABOVE 2000 //NEW ONE 

BUY ABOVE 900 

BUY ABOVE 300... 

Так что, если выполнить выше запросов .. ..Это вернет 3 результат ...

BUY ABOVE 200 

BUY ABOVE 1200 //NEW ONE 

BUY ABOVE 2000 //NEW ONE 

, где я хочу только предложить, где EXACT СУММА составляет 200 ...

ПОКУПКЕ ВЫШЕ 200 .... Как я могу добиться этого ... пожалуйста помощь

+0

попробовать это: Regex шаблон: \ B200 \ б https://dev.mysql.com/doc/refman/5.1/en/regexp.html –

+0

Можете ли вы предоставить нам дополнительную информацию? Почему вы используете 'LIKE'? Почему вы не используете целочисленный тип данных для столбца суммы? – Tom

+0

@Tomva ему нужно иметь char иначе, если бы мой столбец был Integer, я бы не задал этот вопрос ... –

ответ

1

Если шаблон же есть количество находится в конце и разделены пробелом вы можете использовать substring_index функцию

mysql> select substring_index('BUY ABOVE 200',' ',-1) as amount; 
+--------+ 
| amount | 
+--------+ 
| 200 | 
+--------+ 
1 row in set (0.00 sec) 

Таким образом, вы можете сделать запрос в

select * from table where 
substring_index(col_name,' ',-1) = '200' 

Также вы можете использовать RLIKE для согласования

mysql> select 'BUY ABOVE 200' rlike '[[:<:]]200[[:>:]]'; 
+-------------------------------------------+ 
| 'BUY ABOVE 200' rlike '[[:<:]]200[[:>:]]' | 
+-------------------------------------------+ 
|           1 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select 'BUY ABOVE 2000' rlike '[[:<:]]200[[:>:]]'; 
+--------------------------------------------+ 
| 'BUY ABOVE 2000' rlike '[[:<:]]200[[:>:]]' | 
+--------------------------------------------+ 
|           0 | 
+--------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select 'BUY 300 ABOVE' rlike '[[:<:]]200[[:>:]]'; 
+-------------------------------------------+ 
| 'BUY 300 ABOVE' rlike '[[:<:]]200[[:>:]]' | 
+-------------------------------------------+ 
|           0 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select 'BUY 200 ABOVE' rlike '[[:<:]]200[[:>:]]'; 
+-------------------------------------------+ 
| 'BUY 200 ABOVE' rlike '[[:<:]]200[[:>:]]' | 
+-------------------------------------------+ 
|           1 | 
+-------------------------------------------+ 

Так что у вас есть данные, как

  • КУПИТЬ ВЫШЕ 200
  • BUY ВЫШЕ 200 и более
  • 200 И еще купить
  • ПОКУПАТЬ выше 2000
  • Покупать ВЫШЕ 300

и вы хотели бы, чтобы выбрать соответствующий только 200, запрос будет

select * from table where 
colname rlike '[[:<:]]200[[:>:]]' 
+0

Запуск двух запросов ... я думаю, что это не очень хорошая идея ... и у нее нет такой же схемы .. есть ли какой-нибудь способ сделать в regexEXP ... ?? –

+0

Не первые 2 запроса - это пример, а второй - то, как вы можете использовать его в выборе. –

+0

Эй, @ Абик, извините за это, если сумма находится между ... Описание, как * выше 200 и получить предложение * ?? :) –

0

Мы можем сделать это гораздо более простым способом

SELECT * 
FROM TAB 
WHERE CHARACTER_LENGTH (OREPLACE (STRTOK(word,' ',3) , '200' ,''))=0 
Смежные вопросы