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查询不包含任何特殊字符。
发布于 2018-02-10 14:11:03
使用正则表达式:
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', '')将只保留字母数字字符和下划线(_)。
如果你想要更多的控制,你需要列出所有必须删除的字符。例如:如果您想忽略"+“、"-”和“”。“您将使用
SELECT * FROM `item` WHERE REGEXP_REPLACE(`English_name`, '[-+.]', '') RLIKE 'FL7'请注意,有些字符是非常特殊的(-:表示正则表达式,需要使用双反斜杠进行转义。如果你不知道这些字符是什么,你可以将它们全部转义。
有些字符甚至更特殊:要在单引号字符串中使用单个queto,需要编写两次('')。要使用反斜杠,你需要写四次(\\\\)。
忽略"+“、"-”、".“、"'”、"?“和"\“你需要
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 FLOWERMariaDB 10.2 Demo
但是,如果不能使用REGEXP_REPLACE,则需要在嵌套的REPACE表达式中逐个替换所有字符。要仅删除"-“和"+”,您可以使用
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'发布于 2018-02-10 17:26:14
尝试以下查询:
SELECT * FROM `item` WHERE `English_name` LIKE 'FL%'只有当你所有的录音都以"FL“开头时,这才能起作用。
https://stackoverflow.com/questions/48717793
复制相似问题