[英]How to ignore symbols in SQL LIKE
我有一个带有SQL查询的搜索模块,如下所示:
SELECT FROM trilers WHERE title '%something%'
当我搜索关键字例如“蜘蛛侠”时它返回未找到,但是当我搜索“蜘蛛侠”时它返回我的内容(MySQL中的原始行是“蜘蛛侠”)。
我怎能无视像所有的符号-
# #
!
, :
并同时返回“spiderman”和“spider-man”关键字的内容?
您可以做的是在搜索之前替换您不关心的字符。
第一次迭代看起来像这样:
SELECT * FROM trilers WHERE REPLACE(title, '-', '') LIKE '%spiderman%'
这会忽略任何' - '。
接下来你会用另一个REPLACE来说明包含'#',如下所示:
SELECT * FROM trilers WHERE REPLACE(REPLACE(title, '-', ''), '#', '') LIKE '%spiderman%'
对于所有3('!',' - ','#'),您只需将替换为另一个替换,如下所示:
SELECT * FROM trilers WHERE REPLACE(REPLACE(REPLACE(title, '-', ''), '#', ''),'!','') LIKE '%spiderman%'
你可以试试像
SELECT * FROM trilers WHERE replace(title, '-', '') LIKE '%spiderman%'
涉及使用REPLACE
的其他答案很棒,但如果您不关心“spider”和“man”之间出现的字符或两个字符串之间有多少个字符,则可以在表达式中使用其他通配符:
SELECT * FROM Superheroes WHERE HeroName LIKE '%spider%man%';
如果您只想匹配一个字符,但允许任何字符,则可以使用_
通配符 ,它只匹配一个字符:
SELECT * FROM Superheroes WHERE HeroName LIKE '%spider_man%';
这将匹配“spideryman”和“la la land”中的“蜘蛛侠”而不是“spiderysupereliteuberheroman”。
如果您有可能的符号数量有限,那么在没有REPLACE
的情况下执行此操作的方法是使用析取表达式:
SELECT * FROM Superheroes WHERE
HeroName LIKE '%spiderman%'
OR
HeroName LIKE '%spider-man%'
OR
HeroName LIKE '%spider#man%'
OR
HeroName LIKE '%spider!man%';
WHERE trilers REGEXP '[[:<:]]spider[-#!:]?man[[:>:]]'
一些讨论:
[[:<:]] -- word boundary
[-#!:] -- character set, matches any of them. ('-' must be first)
[-#!:]? -- optional -- so that 'spiderman' will still match
与其他答案不同,这将避免匹配
spidermaniac
另外,请考虑使用FULLTEXT
。
您应该可以使用较小的更新来使用搜索。 您应该可以执行以下操作:SELECT FROM trilers WHERE title LIKE'%spider%'。 这应该搜索蜘蛛在其他东西之前或之后的任何东西,如连字符( - )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.