我有一个MySQL数据库,里面有邮政编码有时在数据库中邮政编码中有空格(例如NG1 1AB)有时没有(例如NG11AB)。类似地在PHP查询中从数据库中读取数据,搜索数据库的人可以添加空格或不添加空格。我已经尝试过使用LIKE的各种不同格式,但不能。似乎没有找到有效的搜索手段,使得其任一端都将带来相同的对应行(例如,搜索NG11AB或NG11AB以带来“Bob Smith”或任何对应的行字段)。有什么建议吗?
lsmepo6l1#
我甚至不会使用LIKE或regex,而是简单地删除空格并比较字符串:
LIKE
SELECT * FROM mytable WHERE LOWER(REPLACE(post_code_field, ' ', '')) = LOWER(REPLACE(?, ' ', ''))
请注意,我还将这两个值都转换为小写,以便在用户输入小写邮政编码时仍能正确匹配。
wyyhbhjk2#
SELECT * FROM MYTABLE WHERE REPLACE(MYTABLE.POSTCODE, ' ', '') LIKE '%input%'
确保您的PHP输入也被修剪
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
ruarlubt4#
您可以使用带有 * 元字符的regular expression,它匹配0个或多个字符。例如:
SELECT * FROM the_table WHERE postcode REGEXP "NG1*1AB"
匹配NG11AB和NG1 1AB最常见的元字符列表:*匹配零个或多个+匹配一个或多个{n}匹配n次{m,n}匹配m到n次{n,}匹配n次或更多次^行首$行尾[[:<:]]匹配单词开头[[:>:]]匹配单词结尾[:class:]匹配字符类:[:alpha:]用于字母[:space:]用于空白[:punct:]用于标点符号[:upper:]用于大写字母[abc]匹配其中一个字符[^xyz]匹配任何未包含的字符|分隔备选方案另请参见this question。
NG11AB
NG1 1AB
*
+
{n}
{m,n}
{n,}
^
$
[[:<:]]
[[:>:]]
[:class:]
[:alpha:]
[:space:]
[:punct:]
[:upper:]
[abc]
[^xyz]
|
4条答案
按热度按时间lsmepo6l1#
我甚至不会使用
LIKE
或regex,而是简单地删除空格并比较字符串:请注意,我还将这两个值都转换为小写,以便在用户输入小写邮政编码时仍能正确匹配。
wyyhbhjk2#
确保您的PHP输入也被修剪
ohfgkhjo3#
假设您的列中不仅仅包含邮政编码:在进行类似测试之前,请删除所有空格:
如果您的列中只有 * 邮政编码:
或
正则表达式适用于这两种情况。下面的正则表达式允许每个字母之间有可选的空格:
ruarlubt4#
您可以使用带有 * 元字符的regular expression,它匹配0个或多个字符。
例如:
匹配
NG11AB
和NG1 1AB
最常见的元字符列表:
*
匹配零个或多个+
匹配一个或多个{n}
匹配n次{m,n}
匹配m到n次{n,}
匹配n次或更多次^
行首$
行尾[[:<:]]
匹配单词开头[[:>:]]
匹配单词结尾[:class:]
匹配字符类:[:alpha:]
用于字母[:space:]
用于空白[:punct:]
用于标点符号[:upper:]
用于大写字母[abc]
匹配其中一个字符[^xyz]
匹配任何未包含的字符|
分隔备选方案另请参见this question。