Mysql搜索邮政编码

Posted

技术标签:

【中文标题】Mysql搜索邮政编码【英文标题】:Mysql Search Postcodes 【发布时间】:2017-11-23 10:40:35 【问题描述】:

我想创建一个 mysql 搜索查询,它将在这里搜索邮政编码是我目前所做的

SELECT * FROM orders where ( InvoicePostcode LIKE 'b%' OR InvoicePostcode LIKE 'ws%') order by InvoiceNumber asc

我只想显示以 b 或 ws 开头的邮政编码,但问题是某些帖子在邮政编码的开头包含 bb 或 BS,例如

BS24 8EE

BB9 8SY

唯一应该显示以 b 开头的 B65 0NQ 我不确定如何通过仅查看邮政编码中数字之前开头的字母来检查邮政编码

【问题讨论】:

在***中搜索其他类似问题。有些人建议使用正则表达式 【参考方案1】:

您可以尝试使用正则表达式来排除某些模式:

在下面我排除了包含 B 后跟一个字母的 InvoicePostcode

SELECT * FROM orders
WHERE (InvoicePostcode LIKE 'b%' AND NOT InvoicePostcode RLIKE '^(B[A-Z])')
    OR (InvoicePostcode LIKE 'ws%' AND NOT InvoicePostcode RLIKE '^(WS[A-Z])')
ORDER BY InvoiceNumber ASC

【讨论】:

【参考方案2】:

你可以使用pattern matching来解决这个问题。

您需要知道的是您要搜索的模式,举个例子,如果您要搜索所有以 B 开头的邮政编码,那么您就知道这些邮政编码会

    第一个字符必须为 B。链接中有示例选择第一个字符 (^) 和 1 个实例(1 等于“B”或“b”。 第二个字符可以是任意数字

同样,您也可以对所有其他模式执行此操作。

【讨论】:

【参考方案3】:

您也可以使用 REGEXP 子句。

例如: select * from orders where (InvoicePostcode REGEXP '^B[^BS].' OR InvoicePostcode REGEXP '^WS.')

'^B[^BS].*' 在此它将忽略以 BB OR BS 开头的单词。

希望对你有所帮助。

【讨论】:

【参考方案4】:
SELECT * FROM orders
WHERE (InvoicePostcode LIKE 'b%' AND NOT InvoicePostcode RLIKE '^(B[A-Z])')
    OR (InvoicePostcode LIKE 'ws%' AND NOT InvoicePostcode RLIKE '^(WS[A-Z])')
ORDER BY InvoiceNumber ASC

请参考:https://www.guru99.com/regular-expressions.html

RLIKE 运算符执行字符串表达式与模式的模式匹配。模式作为参数提供。以下 MySQL 语句将查找以“B”开头的作者姓名。 '^' 已用于匹配名称的开头。

SELECT * FROM orders WHERE InvoicePostcode RLIKE '^B';

[A-Z] 匹配任何大写字母​

[a-z] 匹配任何小写字母​

'^(B[A-Z])'表示它将作为第一个字母B工作,而下一个是否是A到Z都不是。

【讨论】:

以上是关于Mysql搜索邮政编码的主要内容,如果未能解决你的问题,请参考以下文章

Mysql全文搜索,自然语言模式:按“亲密度”排序

关于Mysql的编码问题

MySQL--SQL优化案例--隐式字符编码转换

Mysql 搜索 1.18 亿行耗时 86 秒

用于在字段之间搜索一个字母数字邮政编码的 Mongodb 查询

my.conf 修改编码