今天心血来潮,想搞搞 SQL 里的字符串查找,主要是想弄清楚怎么找到一个字符串在另一个字符串里头第一次出现的位置。搜一下,发现大家伙儿都管这个叫 "SQLINDEXOF",我就跟着这么叫哈。
我一开始以为 SQL 里有个直接叫 INDEXOF 的函数,就像其他编程语言里那样。结果一顿操作猛如虎,发现根本不是那么回事儿!
实践出真知
原来,不同的数据库,它用的函数还不一样。这可真是…各有各的脾气。
- 像 SQL Server,人家用的是 CHARINDEX 函数。
- MySQL ,用的是 INSTR 函数。
- Oracle 更厉害,人家有 FBI(基于函数的索引)这种高级玩意儿。不过平时找个位置,INSTR 也够用。
我平时用的是 MySQL 比较多,所以就拿 INSTR 来举个例子。
比如说,我想在一个叫 "products" 的表里头,找到 "description" 字段里头包含 "好用" 这个词的记录,而且想知道 "好用" 是从第几个字符开始出现的。我一开始这么写的:
SELECT description, INDEXOF(description, '好用') AS position FROM products WHERE description LIKE '%好用%';
结果,啪!报错!说没有 INDEXOF 这个函数。我就说嘛哪有这么简单。
后来我老老实实地改成 INSTR:
SELECT description, INSTR(description, '好用') AS position FROM products WHERE description LIKE '%好用%';
这下子,世界终于清静。跑出来的结果里,"position" 那一列就显示 "好用" 在 "description" 里头第一次出现的位置,从 1 开始数。要是没找到,就显示 0。
一点小感悟
这回折腾让我明白,搞数据库,不能想还是得踏踏实实地查资料,看文档。不同的数据库,规矩不一样,函数也不一样。以后再遇到类似的问题,我就知道该怎么下手。
对, 差点儿忘说。 假如你用的是 C#,想在字符串里找位置,可以用 *,这个跟 SQL 里的这些函数,作用是差不多的,不过一个是 C# 用的,一个是数据库用的,可别搞混哈!