带空格的MySQL 'LIKE'查询

niwlg2el  于 2023-03-28  发布在  Mysql
关注(0)|答案(4)|浏览(131)

我有一个MySQL数据库,里面有邮政编码有时在数据库中邮政编码中有空格(例如NG1 1AB)有时没有(例如NG11AB)。类似地在PHP查询中从数据库中读取数据,搜索数据库的人可以添加空格或不添加空格。我已经尝试过使用LIKE的各种不同格式,但不能。似乎没有找到有效的搜索手段,使得其任一端都将带来相同的对应行(例如,搜索NG11AB或NG11AB以带来“Bob Smith”或任何对应的行字段)。
有什么建议吗?

lsmepo6l

lsmepo6l1#

我甚至不会使用LIKE或regex,而是简单地删除空格并比较字符串:

SELECT *
FROM mytable
WHERE LOWER(REPLACE(post_code_field, ' ', '')) = LOWER(REPLACE(?, ' ', ''))

请注意,我还将这两个值都转换为小写,以便在用户输入小写邮政编码时仍能正确匹配。

wyyhbhjk

wyyhbhjk2#

SELECT *
FROM MYTABLE
WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'

确保您的PHP输入也被修剪

ohfgkhjo

ohfgkhjo3#

假设您的列中不仅仅包含邮政编码:在进行类似测试之前,请删除所有空格:

where replace(postcode, ' ', '') like '%NG11AB%'

如果您的列中只有 * 邮政编码:

where replace(postcode, ' ', '') = 'NG11AB'

where postcode like 'N%G%1%1%A%B'

正则表达式适用于这两种情况。下面的正则表达式允许每个字母之间有可选的空格:

where postcode rlike 'N ?G ?1 ?1 ?A ?B' -- use regex
ruarlubt

ruarlubt4#

您可以使用带有 * 元字符的regular expression,它匹配0个或多个字符。
例如:

SELECT * FROM the_table
WHERE postcode REGEXP "NG1*1AB"

匹配NG11ABNG1 1AB
最常见的元字符列表:
*匹配零个或多个
+匹配一个或多个
{n}匹配n次
{m,n}匹配m到n次
{n,}匹配n次或更多次
^行首
$行尾
[[:<:]]匹配单词开头
[[:>:]]匹配单词结尾
[:class:]匹配字符类:
[:alpha:]用于字母
[:space:]用于空白
[:punct:]用于标点符号
[:upper:]用于大写字母
[abc]匹配其中一个字符
[^xyz]匹配任何未包含的字符
|分隔备选方案
另请参见this question

相关问题