繁体   English   中英

如何忽略SQL LIKE中的符号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM