在mysql中匹配长字符串(完整邮政编码)与短字符串(邮政编码开头)
Posted
技术标签:
【中文标题】在mysql中匹配长字符串(完整邮政编码)与短字符串(邮政编码开头)【英文标题】:Matching long string (full postcode) agains short string (start of postcode) in mysql 【发布时间】:2010-10-15 10:47:40 【问题描述】:我有一个表格,其中包含邮政编码中的起始字母列表,例如LS 代表利兹,SO 代表南安普顿。
我想将这些与用户输入的完整邮政编码进行匹配,例如LS19 1AB。
我已经研究过在我的查询中使用 LIKE 和一些正则表达式的东西,但我正在努力寻找一种正确的方法来做到这一点。
【问题讨论】:
向我们展示您迄今为止所做的尝试,并描述它在哪些方面没有达到您想要的效果。 为什么不只使用用户输入的第一个to字符进行匹配呢?都是长度为 2 的起始字母吗?在纯 SQL 中:where post_code = SUBSTRING('LS19 1AB',0,2)
是的,不幸的是,利物浦等一些地区以一个字母 l 开头 - 但是它后面跟着一个数字,所以如果我可以提取所有数字,这将起作用
【参考方案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)
【讨论】:
啊——太棒了,但是如果我有另一行的值为“L”,它也会返回这个值,以任何方式匹配数字前的第一个字母或两个字母 听起来有点难,如果你想要最长的匹配,并且只有一个匹配,你可以添加一个order by post_code desc limit 1;
但是,另一方面,如果你事先知道只匹配 1 或 2 个字符,您只需在匹配 2 个字母时执行 `where SUBSTRING('LS19 1AB',1,2) = post_code;`。以上是关于在mysql中匹配长字符串(完整邮政编码)与短字符串(邮政编码开头)的主要内容,如果未能解决你的问题,请参考以下文章