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