【问题标题】:How to ignore symbols in SQL LIKE如何忽略 SQL LIKE 中的符号
【发布时间】:2018-12-30 12:32:54
【问题描述】:

我有一个带有如下 SQL 查询的搜索模块:

SELECT FROM trilers WHERE title '%something%'

当我搜索诸如“spiderman”之类的关键字时,它返回未找到,但是当我搜索“spider-man”时,它返回我的内容(MySQL 中的原始行是“spider-man”)。

如何忽略-#!: 等所有符号并同时返回包含“spiderman”和“spider-man”关键字的内容?

【问题讨论】:

  • 您正在寻找正则表达式搜索。
  • 在您的表格中添加一个没有符号的列,然后搜索它。否则使用 REGEXP 但它很慢。
  • 在 INSERT/UPDATE 之前清理数据是解决方案的一半。 (通常使用触发器完成。)
  • 这是一个有趣的问题。哪种方式对数据库的资源更好?制作 tmp 结果集并操作结果还是在客户端进行?
  • 也许有比添加另一列更简单的方法?

标签: mysql sql


【解决方案1】:

您可以做的是在搜索发生之前替换您不关心的字符。

第一次迭代如下所示:

SELECT * FROM  trilers WHERE REPLACE(title, '-', '') LIKE '%spiderman%'

这将忽略任何'-'。

接下来,您将使用另一个 REPLACE 来 rap 以包含 '#',如下所示:

SELECT * FROM  trilers WHERE REPLACE(REPLACE(title, '-', ''), '#', '') LIKE '%spiderman%'

对于所有 3 个 ('!','-','#'),您只需将 Replace 增加为另一个 Replace,如下所示:

SELECT * FROM  trilers WHERE REPLACE(REPLACE(REPLACE(title, '-', ''), '#', ''),'!','') LIKE '%spiderman%'

【讨论】:

    【解决方案2】:

    你可以试试

    SELECT * FROM trilers WHERE replace(title, '-', '') LIKE '%spiderman%'

    【讨论】:

      【解决方案3】:

      涉及使用REPLACE 的其他答案很棒,但是如果您不关心“蜘蛛”和“人”之间出现什么字符或两个字符串之间有多少字符,您可以使用额外的通配符你的表情:

      SELECT * FROM Superheroes WHERE HeroName LIKE '%spider%man%';
      

      如果你只想匹配一个字符,但允许任何字符,你可以使用_ wildcard,它只匹配一个字符:

      SELECT * FROM Superheroes WHERE HeroName LIKE '%spider_man%';
      

      这将匹配“spideryman”和“spideryman in 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%';
      

      【讨论】:

        【解决方案4】:
        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

        【讨论】:

          【解决方案5】:

          您应该能够通过小幅更新使用您的搜索。您应该能够执行以下操作:SELECT FROM trilers WHERE title LIKE '%spider%'。这应该搜索蜘蛛在连字符 (-) 之前或之后的任何内容

          【讨论】:

          • 但是当有类似条目时该怎么办:蜘蛛侠;蜘蛛侠?
          • 我想您希望一个查询返回结果而不是两个,对吗?
          • 好吧,作为用户,你有什么期望?如果您正在搜索 Sub-Way 餐厅,您不希望结果中没有子站,对吧?
          • 这通常更容易,是的。您可以尝试一个应该工作的工会。 SELECT FROM trilers WHERE title LIKE 'spiderm%' UNION SELECT FROM trilers WHERE title LIKE 'spider-m%'
          猜你喜欢
          • 1970-01-01
          • 2012-04-08
          • 2014-08-20
          • 2018-04-22
          • 1970-01-01
          • 2010-09-12
          • 2015-02-17
          相关资源
          最近更新 更多