【问题标题】:Is there any function for finding the result with special character in a sql like?是否有任何函数可以在 sql 中查找具有特殊字符的结果?
【发布时间】:2019-06-17 06:39:43
【问题描述】:

我正在尝试使用 LIKE 从 SQL 获取数据,成功获取数据但结果超出了我的需要

这是我的一些数据

apple1
apple2
apple3
applejuice1
applej1
applej2

我的查询:

select * from apple where name like '%applej%'

目前我得到了:

applejuice1
applej1
applej2

我的预期输出:

applej1
applej2

【问题讨论】:

  • like 'applej_' 好吗?
  • 有一些答案涉及使用正则表达式。虽然这对于复杂匹配很有用,但我仍然建议尽可能使用 LIKE 运算符的 _ 通配符。正则表达式可能是性能杀手,我不确定正则表达式是否也可以被索引使用。 (我知道 LIKE 运算符经常可以使用索引,这是非常可取的。)
  • 你能进一步解释一下吗?标题中的“特殊字符”是什么意思?

标签: mysql sql sql-like


【解决方案1】:

你可以试试这个,

SELECT * FROM apple where name LIKE '%applej_'

'_' 用于表示 SQL server 中的单个字符。 对于 MS Access,你可以试试这个

SELECT * FROM apple where name LIKE '*applej?'

【讨论】:

  • 我不想要applejuice1,但是你的sql会返回它
  • @TommyTang 我非常怀疑...SELECT * FROM apple where name LIKE '%applej_' 应该可以正常工作。 (它在我的 MariaDB 实例上运行良好,至少......)
  • 但是如果我的数据是applej1,applej15?
  • @TommyTang 是的,然后它变得更加复杂。 _ 通配符只代表一个字符,因此要匹配 15,您需要使用其中的两个。但这也将匹配1a,例如。如果您想将apple123456'apple______' 匹配,它将再次包含applejuice1。在这里,您可能确实想使用正则表达式。
  • @TommyTang 如果你想得到 applej15 或 applej 之后的任何两位整数,你可以使用 SELECT * FROM apple where name LIKE '%applej[0-9][0-9]' 或者如果你不想在 applej 之后使用任何字母,你可以使用 'applej[^a-z]' (@ 987654332@代表单个字符)
【解决方案2】:

使用REGEXP 这是可能的:

select * 
from apple 
where `name` REGEXP '^applej[0-9]'

Demo on db<>fiddle.


更新:

如果name 的数据为applej1, applej2, applej15, applej109,则以下查询将起作用:

select * 
from apple 
where `name` REGEXP '^applej[0-9]+'

Demo on db<>fiddle

【讨论】:

    【解决方案3】:

    您可以使用正则表达式,这将包括所有包含 'applej' + 0 或 1 个字符的行

    SELECT * FROM test WHERE  col1 REGEXP '^applej.?$'
    

    这会找到所有包含 'applej' + 正好 1 个字符的行

    SELECT * FROM test WHERE  col1 REGEXP '^applej.{1}$'
    

    如果 'applej' 后面的数字可能包含多个数字

    SELECT * FROM test WHERE  col1 REGEXP '^applej[0-9]+$'
    

    当然,也许上面 cmets 中 @forpas 建议的 LIKE 就是你所需要的

    【讨论】:

      【解决方案4】:

      我找到了解决方案

      SELECT * FROM apple WHERE MATCH(name) AGAINST('applej')
      

      【讨论】:

      • 全文搜索...是的,这也可以完成这项工作。您可能需要进一步检查一下,以确定它是否真的在所有方面都满足您的需求:stackoverflow.com/questions/224714/…
      猜你喜欢
      • 2020-07-22
      • 2015-12-03
      • 2021-12-23
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多