今天给大家伙儿唠唠这个叫 PATINDEX 的玩意儿。前些天,我这脑袋瓜子里突然就蹦出个需求,想从一堆文本里头找找特定的字符在啥位置。你想,这平时用惯各种高级编程语言,都有那些个 find、indexOf 之类的函数,用起来贼方便,可到数据库这儿,我突然就懵圈,咋弄这是?
于是乎,我赶紧上网一顿搜,好家伙,还真让我找到 PATINDEX 这宝贝。这名字听着就挺洋气,不过也确实好使。 PATINDEX 它主要是用来返回一个字符串在另一个字符串里头第一次冒头的那个位置。如果找不着,它就乖乖地返回个0。
我当时的需求也挺简单的,就是想在一个字段里头看看有没有“abc”这三个字母挨一块儿的情况。我琢磨一下,这用 PATINDEX 咋写?经过一番倒腾,我发现这玩意的用法还挺灵活:
- 第一种用法:PATINDEX('%abc%', 列名)。这个写法挺像平时咱用 LIKE 的那种感觉,就是看看'abc'是不是在目标字符串里头,只要'abc'出现,不管它在哪儿,都能找到它。
- 第二种用法:PATINDEX('%abc', 列名)。这个跟第一个有点像,但是它只找以'abc'结尾的那种情况。你可以理解成,它从字符串的屁股后头往前找'abc'。
- 第三种用法:PATINDEX('abc%', 列名)。跟第二个反着来,这个是找以'abc'开头的,从头开始找,看看'abc'是不是在最前面。
比如说,我有个表叫“用户表”,里头有个字段叫“备注”,我想看看哪些用户的备注里头有“测试”这俩字,我就可以这么写:“SELECT FROM 用户表 WHERE PATINDEX('%测试%', 备注) > 0”。
然后我就想用它来筛选出那些字段里头有非数字的,于是我就写类似于“PATINDEX('%[^0-9]%', 字段名) > 0”这样的语句。它,主要就是帮我把那些字段里头有不是数字的字符的给揪出来。然后我就能对这些数据单独处理,美滋滋。
这么一实践,我对 PATINDEX 的认识又深一层。它跟 CHARINDEX 还是有点区别的,CHARINDEX 它不认那些通配符,只能老老实实地找固定的字符串。而 PATINDEX ,它可以用通配符,找起来更灵活,有点儿正则表达式那意思。
这回的实践让我收获满满,以后再遇到类似的需求,我就知道咋用 PATINDEX 来解决问题。希望我这回的分享能帮到大家伙儿,让大家伙儿在处理数据库文本数据的时候,也能多个趁手的工具!