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查询不包含任何特殊字符时。
答案 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
但是如果你不能使用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”开头时才会起作用。