【问题标题】:Matching long string (full postcode) agains short string (start of postcode) in mysql在mysql中匹配长字符串(完整邮政编码)与短字符串(邮政编码开头)
【发布时间】:2010-10-15 10:47:40
【问题描述】:

我有一个表格,其中包含邮政编码中的起始字母列表,例如LS 代表利兹,SO 代表南安普顿。

我想将这些与用户输入的完整邮政编码进行匹配,例如LS19 1AB。

我已经研究过在我的查询中使用 LIKE 和一些正则表达式的东西,但我正在努力寻找一种正确的方法来做到这一点。

【问题讨论】:

  • 向我们展示您迄今为止所做的尝试,并描述它在哪些方面没有达到您想要的效果。
  • 为什么不只使用用户输入的第一个to字符进行匹配呢?都是长度为 2 的起始字母吗?在纯 SQL 中:where post_code = SUBSTRING('LS19 1AB',0,2)
  • 是的,不幸的是,利物浦等一些地区以一个字母 l 开头 - 但是它后面跟着一个数字,所以如果我可以提取所有数字,这将起作用

标签: mysql regex sql-like postal-code


【解决方案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;`。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 2014-01-31
  • 2015-05-21
相关资源
最近更新 更多