2013-03-27 3 views
0

Я пытаюсь использовать RLIKE для соответствия тому, где за строкой данных следует либо конкретный символ, либо конец строки ($). Я получаю ожидаемые результаты, используя только конец символа строки ($), или только ожидаемый символ, или даже любой набор ожидаемых символов внутри квадратных скобок, но как только я перехожу в квадратные скобки для ожидаемого символа ИЛИ и конца string, конец строки не сопоставляется.Mysql RLIKE - конец конца строки или другой символ

Вот пример:

SQL данные:

CREATE TABLE test_table (id int auto_increment primary key, search_string varchar(8)); 
INSERT INTO test_table (search_string) VALUES("123456789"); 
INSERT INTO test_table (search_string) VALUES("1234567"); 
INSERT INTO test_table (search_string) VALUES("123456"); 
INSERT INTO test_table (search_string) VALUES("12345"); 
INSERT INTO test_table (search_string) VALUES("12345E"); 

Пример запросов по этим данным:

SELECT count(*) FROM test_table WHERE search_string RLIKE "56[7]"; 
# the above returns fine - 2 rows (first and second) 

SELECT count(*) FROM test_table WHERE search_string RLIKE "56[7YE]"; 
# the above returns fine - 2 rows (rows 2 and 5) as expected 

SELECT count(*) FROM test_table WHERE search_String RLIKE "56$"; 
# the above returns fine - 1 rows (the third) as expected as 6 is followed by end of string 

SELECT count(*) FROM test_table WHERE search_string RLIKE "56[7$]"; 
# the above returns only 1 row and should be 2 (rows 2 and 3 - '56' should be followed by a 7 or end of string) 

Есть специальный способ лечения символа $ когда он находится в квадратных скобках?

ответ

3

Регулярное выражение может просто нуждаться в небольшой настройке. Вместо того, чтобы 56[7$] вместо этого вы должны использовать один из следующих

56($|7) 
56($|[7YE]) 

Within [], то $ пытается соответствовать буквальный знак доллара. Вместо этого вы ищете $, чтобы соответствовать концу строки, и поэтому она не может находиться в квадратных скобках.

+0

А, спасибо, что отлично работает! –

0

Это один работал, когда я пробовал на тестовые данные:

SELECT COUNT(*) FROM test_table WHERE search_string RLIKE '567{0,1}$' 

Я попытался 56($|7) и получил строку 2 и 3, но он также получил ряд 1

[Edit: {0,1} (один или больше совпадений) является особым случаем, представленным ?, поэтому выражение может также быть 567?$.]

+0

Поскольку строка 1 была 123456789 и поэтому регулярное выражение соответствовало 567, содержащемуся в соответствии с запросом –

+0

Вы правы @ Simonatmso.net - письменное требование не совсем соответствует последнему комментарию в примере кода («... должно быть 2 (строки 2 и 3 ... "). –

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

  • Нет связанных вопросов^_^