在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中匹配长字符串(完整邮政编码)与短字符串(邮政编码开头)的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP系列——长连接与短连接的区别

TCP/IP系列——长连接与短连接的区别

关于xampp mysql字符编码与编译器编码不匹配问题

MySQL基础 - 编码设置

MySQL 查找子字符串匹配并按匹配全字分组

CC2530强化实训03定时器间隔定时实现按键长按与短按