Mysql喜欢查询跳过特殊字符

时间:2018-02-10 06:05:55

标签: mysql

SQL:

SELECT * FROM `item` WHERE `English_name` LIKE '%FL7%'

数据:

FL-710 FLOWER
FL-711 FLOWER
FL-712 FLOWER
FL-713 FLOWER
FL-693 FLOWER
FL71 FLOWER
FL69 FLOWER

输出:

FL71 FLOWER

预期产出:

FL-710 FLOWER
FL-711 FLOWER
FL-712 FLOWER
FL-713 FLOWER
FL71 FLOWER

任何人都可以告诉我如何实现预期的输出。我不想扫描特殊字符。当like查询不包含任何特殊字符时。

2 个答案:

答案 0 :(得分:0)

使用正则表达式:

SELECT * FROM `item` WHERE `English_name` RLIKE 'FL-?7'

-?表示-是可选的。

<强>更新

如果要忽略列中的任何特殊字符,则需要从值中删除它们。

使用MySQL 8或MariaDB 10.2,您可以使用REGEXP_REPLACE

SELECT * FROM `item` WHERE REGEXP_REPLACE(`English_name`, '\\W', '') RLIKE 'FL7'

REGEXP_REPLACE(English_name, '\\W', '')只保留字母数字字符和下划线(_)。

如果您想要更多控件,则需要列出所有必须删除的字符。例如:如果你想忽略&#34; +&#34;,&#34; - &#34;和&#34;。&#34;你会用

SELECT * FROM `item` WHERE REGEXP_REPLACE(`English_name`, '[-+.]', '') RLIKE 'FL7'

请注意,某些字符非常特殊( - :对于正则表达式,需要使用双反斜杠进行转义。如果您不知道它们是哪些字符,则可以将它们全部转义。

有些字符甚至更特殊:要在单引号字符串中使用单个queto,您需要将其写入两次('')。要使用反斜杠,您可以将其写入四次(\\\\)。

忽略&#34; +&#34;,&#34; - &#34;,&#34;。&#34;,&#34;&#39;&#34;,&# 34;?&#34;和&#34; \&#34;你需要

SELECT *
FROM `item`
WHERE REGEXP_REPLACE(`English_name`, '[\\+\\-\\.\\''\\?\\\\]', '') RLIKE 'FL7'

你会得到这样的结果:

FL-710 FL_OWER
F+L711 FLOWER
F\L.712 FLOWER
FL'713 FLOWER
FL71 FLOWER

MariaDB 10.2 Demo

但是如果你不能使用REGEXP_REPLACE,你需要在嵌套的REPACE表达式中逐个替换所有字符。仅删除&#34; - &#34;和&#34; +&#34;你会用

SELECT *
FROM `item`
WHERE REPLACE(REPLACE(English_name, '-', ''), '+', '') RLIKE 'FL7'

要删除的字符越多,表达式就越复杂。但是你可以编写一个函数remove_special_chars(),你可以使用过程编程来获得更易读的代码:

CREATE FUNCTION remove_special_chars(str TEXT)
RETURNS TEXT
LANGUAGE SQL
DETERMINISTIC
NO SQL
BEGIN
    SET str = REPLACE(str, '-', '');
    SET str = REPLACE(str, '+', '');
    SET str = REPLACE(str, '*', '');
    SET str = REPLACE(str, '/', '');
    SET str = REPLACE(str, '.', '');
    SET str = REPLACE(str, '''', '');
    SET str = REPLACE(str, '\\', '');
    -- add more 
    RETURN str;
END

然后你的查询将是

SELECT * FROM `item` WHERE remove_special_chars(`English_name`) RLIKE 'FL7'

答案 1 :(得分:0)

尝试以下查询:

SELECT * FROM `item` WHERE `English_name` LIKE  'FL%'

仅当您所有记录以“FL”开头时才会起作用。