Сопоставление длинной строки (полный почтовый индекс) с короткой строкой (начало почтового индекса) в mysql

У меня есть таблица, содержащая список начальных букв в почтовом индексе, например. LS для Лидса и SO для Саутгемптона.

Я хочу сопоставить их с введенным пользователем полным почтовым индексом, например. ЛС19 1АБ.

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


person Chris Marshall    schedule 15.10.2010    source источник
comment
Покажите нам, что вы пробовали до сих пор, и опишите, почему это не делает то, что вы хотите.   -  person The Archetypal Paul    schedule 15.10.2010
comment
почему бы не использовать только первые символы пользовательского ввода для сопоставления? все начальные буквы длины 2? в чистом SQL: where post_code = SUBSTRING('LS19 1AB',0,2)   -  person sfussenegger    schedule 15.10.2010
comment
да, к сожалению, некоторые области, такие как ливерпуль, начинаются с одной буквы l, однако затем следует цифра, поэтому, если бы я мог извлечь все числа, это сработало бы   -  person Chris Marshall    schedule 15.10.2010


Ответы (1)


Вы можете перевернуть предложение where и выполнить некоторые трюки со строками:

create table post_codes(
  post_code varchar(32)
);


mysql> insert into post_codes values("AS");
Query OK, 1 row affected (0.00 sec)

mysql> insert into post_codes values("LS");
Query OK, 1 row affected (0.00 sec)

mysql> select post_code from post_codes where 'LS19 1AB' like CONCAT(post_code,'%');
+-----------+
| post_code |
+-----------+
| LS        |
+-----------+
1 row in set (0.00 sec)
person nos    schedule 15.10.2010
comment
ahh - замечательно, однако, если у меня есть другая строка со значением «L», она также вернет это, в любом случае, чтобы сопоставить первую букву или две буквы перед числами - person Chris Marshall; 15.10.2010
comment
Звучит немного сложнее, если вам нужно самое длинное совпадение и только одно совпадение, вы можете добавить order by post_code desc limit 1;, хотя, с другой стороны, если вы заранее знаете, что нужно сопоставлять только 1 или 2 символа, вы просто делаете `where SUBSTRING( 'LS19 1AB',1,2) = post_code;` при совпадении двух букв. - person nos; 15.10.2010