添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
霸气的核桃  ·  None of the MLIR ...·  8 月前    · 
温柔的沙滩裤  ·  ZeroMQ及其模式 - 知乎·  2 年前    · 
SQL之文质彬彬(二)

SQL之文质彬彬(二)

如何正确地在文本搜索中偷懒

前几天我们入门了高大上的正则表达式,那么今天我们就先在这个话题上继续借题发挥一下,所谓温故而知新,可以为师也~

逃离预期

由于正则表达式语言由具有特定含义的特殊字符构成,当我们想检索这些字符时,我们需要对那些特殊字符进行escaping(转义)。

这个操作利用双反斜杠“\\“即可解决。

若是要匹配反斜杠本身,则需要三个反斜杠"\\\"。

其实多数正则表达式可以使用单个反斜杠转义特殊字符,但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。

转义举例

比如我们想知道出现了小数点或者句号(英文)的产品名有哪些,假如我们不用escaping (转义)的话:

SELECT prod_name
FROM products
WHERE prod_name REGEXP '.'
ORDER BY prod_name

因为英文句号/小数点“.”可以匹配任意字符,所以如果我们想要找出含有句号/小数点的行,代码其实是:

WHERE 列名 REGEXP '\\.'

因此我们需要调整如下:

SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\.'
ORDER BY prod_name

这样对了。

另外,双反斜杠“\\“也用来引用元字符(具有特殊含义的字符),以下是空白元字符:

也有重复元字符:

元字符举例

假如我们想找出每一份TNT炸药里有几根:

SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name

我们来先分解一下正则:

  • \\(:转义,左括号“(”
  • [0-9]:0到9中的任意数字
  • 固定空格
  • stick:固定文本
  • S?:可能有s,可能没有
  • \\):转义,右括号“)”

得到返回如下:

若是能熟练运用这些元字符,可以在未来中有效提高工作效率。【也是亲身体验了···大佬一行搞定,我写了大概五六行,嗯····

承前启后

但若是我们想找出一个只有5个字母的产品应该要怎么做?

像这样?

SELECT prod_name