PostgreSQL: 如何判断字符串中是否包含指定字符

今天有开发人员问到: PostgreSQL 中是否有函数可以判断一个字符串中是否包含指定字符,如果包含则返回 ture ,否则返回 false,例如,如果字符串 ‘abcde’ 中包含 ‘ab’ 则返回 true,于是想了想,共总结以下三种方法,暂且不考虑性能。

创建测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
francs=> create table test_compare(id serial primary key, name varchar(32));  
NOTICE: CREATE TABLE will create implicit sequence "test_compare_id_seq" for serial column "test_compare.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_compare_pkey" for table "test_compare"
CREATE TABLE

francs=> insert into test_compare(name) values ('a');
INSERT 0 1
francs=> insert into test_compare(name) values ('ab');
INSERT 0 1
francs=> insert into test_compare(name) values ('abc');
INSERT 0 1
francs=> insert into test_compare(name) values ('bcd');
INSERT 0 1
francs=> insert into test_compare(name) values ('bcde');
INSERT 0 1
francs=> insert into test_compare(name) values ('bcde123');
INSERT 0 1
francs=> insert into test_compare(name) values ('bcde12');
INSERT 0 1
francs=> insert into test_compare(name) values ('cdef');
INSERT 0 1

francs=> select * from test_compare;
id | name
----+---------
1 | a
2 | ab
3 | abc
4 | bcd
5 | bcde
6 | bcde123
7 | bcde12
8 | cdef
(8 rows)

备注:上面创建了测试表并插入测试数据,目标找出 name 字段中包含字符串”bc” 的记录。

方法一: 使用 position 函数

1.1 使用 position 函数

1
2
3
4
5
6
7
8
9
francs=> select * from test_compare where position('bc' in name) >0;  
id | name
----+---------
3 | abc
4 | bcd
5 | bcde
6 | bcde123
7 | bcde12
(5 rows)

1.2 position 函数简价

Function: position(substring in string)
Return Type: int
Description: Location of specified substring

1.3 example

1
2
3
4
5
francs=> select position('bc' in 'bcd');  
position
----------
1
(1 row)

备注: position 函数是找出一个字符串在另一个字符串中出现的位置,如果找不到则返回整型 0。

方法二: 使用正责表达式

2.1 使用正责表达式

1
2
3
4
5
6
7
8
9
francs=> select * from test_compare where name ~ 'bc';  
id | name
----+---------
3 | abc
4 | bcd
5 | bcde
6 | bcde123
7 | bcde12
(5 rows)

备注:上面使用的是正责表达式,关于正责表达式的更多用法,请参考手册

也可以参考之前的 blog

方法三: 使用矩阵比较函数 @>

3.1 使用矩阵比较函数 @>

1
2
3
4
5
6
7
8
9
francs=> select * from test_compare where regexp_split_to_array(name,'') @> array['b','c'];  
id | name
----+---------
3 | abc
4 | bcd
5 | bcde
6 | bcde123
7 | bcde12
(5 rows)

备注:方法三使用了字符串函数 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
2
3
4
5
6
7
8
9
10
11
francs=> select regexp_split_to_array('hello world',' ');  
regexp_split_to_array
-----------------------
{hello,world}
(1 row)

francs=> select regexp_split_to_array('hello','');
regexp_split_to_array
-----------------------
{h,e,l,l,o}
(1 row)

3.4 矩阵 @> 操作符简介

Operator: @>
Description: contains
Example: ARRAY[1,4,3] @> ARRAY[3,1]
Result: t

3.5 example

1
2
3
4
5
6
7
8
9
10
11
francs=> select ARRAY[1,4,3] @> ARRAY[3,1];  
?column?
----------
t
(1 row)

francs=> select ARRAY[1,4,3] @> ARRAY[3,1,5];
?column?
----------
f
(1 row)

备注:@> 操作符是用来比较矩阵数据是否包含,关于矩阵操作符和函数,参考手册
http://www.postgresql.org/docs/9.2/static/functions-array.html

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/237889.html

(1)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论