今天有开发人员问到: PostgreSQL 中是否有函数可以判断一个字符串中是否包含指定字符,如果包含则返回 ture ,否则返回 false,例如,如果字符串 ‘abcde’ 中包含 ‘ab’ 则返回 true,于是想了想,共总结以下三种方法,暂且不考虑性能。
创建测试表
1 |
create table test_compare(id serial primary key, name varchar(32)); |
备注:上面创建了测试表并插入测试数据,目标找出 name 字段中包含字符串”bc” 的记录。
方法一: 使用 position 函数
1.1 使用 position 函数
1 |
francs=> select * from test_compare where position('bc' in name) >0; |
1.2 position 函数简价
Function: position(substring in string)
Return Type: int
Description: Location of specified substring
1.3 example
1 |
francs=> select position('bc' in 'bcd'); |
备注: position 函数是找出一个字符串在另一个字符串中出现的位置,如果找不到则返回整型 0。
方法二: 使用正责表达式
2.1 使用正责表达式
1 |
francs=> select * from test_compare where name ~ 'bc'; |
备注:上面使用的是正责表达式,关于正责表达式的更多用法,请参考手册
也可以参考之前的 blog
方法三: 使用矩阵比较函数 @>
3.1 使用矩阵比较函数 @>
1 |
francs=> select * from test_compare where regexp_split_to_array(name,'') @> array['b','c']; |
备注:方法三使用了字符串函数 regexp_split_to_array 和矩阵操作符 @>
3.2 regexp_split_to_array 函数简介
regexp_split_to_array 函数用于将字符串转换成矩阵,用户如下
Function: regexp_split_to_array(string text, pattern text [, flags text ])
Return Type: text[]
Description: Split string using a POSIX regular expression as the delimiter. See Section 9.7.3 for more information.
3.3 example
1 |
francs=> select regexp_split_to_array('hello world',' '); |
3.4 矩阵 @> 操作符简介
Operator: @>
Description: contains
Example: ARRAY[1,4,3] @> ARRAY[3,1]
Result: t
3.5 example
1 |
francs=> select ARRAY[1,4,3] @> ARRAY[3,1]; |
备注:@> 操作符是用来比较矩阵数据是否包含,关于矩阵操作符和函数,参考手册
http://www.postgresql.org/docs/9.2/static/functions-array.html。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/237889.html