Postgresql对模糊查询的支持,主要有三种方法:传统的like操作符、SQL99新增的SIMILAR TO操作符以及POSIX正则表达式。除了前面两种SQL标准的模糊查询手段,Postgresql对正则表达式具有强大的支持,这就使得Postgresql可以支持任意字符串的匹配查找,下面我们分别对这三种方法进行学习。

一、LIKE操作符

1.1 “%”代表0个或任意个数的任意字符

       %代表了0个以上的任意字符,为了验证%的使用,下面先看下测试表里面的数据:

stock_analysis_data=# select * from users;
 id |    tag    
----+-----------
  1 | asdfghjkl
  2 | asdfgh
  3 | zxcvsdf
  4 | asdfasd
  5 | jklxcvb
  6 | qwsxdf
(6 rows)

       查询tag以asd开头的所有的数据:

stock_analysis_data=# select * from users where tag like 'asd%';
 id |    tag    
----+-----------
  1 | asdfghjkl
  2 | asdfgh
  4 | asdfasd
(3 rows)

       查询以asd结尾的所有的数据:

stock_analysis_data=# select * from users where tag like '%asd';
 id |   tag   
----+---------
  4 | asdfasd
(1 row)

1.2 “_”代表1个任意字符

       “_”可以代表任意一个字符,相对于“%",使用”_“进行查询时具有了一定的限制,首先就是能且仅能代表一个字符。然后在查询时,对于目标字段,在where条件中,要能提供”_“以外

精确的字符。

       查询以任意字符开头,”xcvsdf“结尾的所有数据:

stock_analysis_data=# select * from users where tag like '_xcvsdf';
 id |   tag   
----+---------
  3 | zxcvsdf
(1 row)

       查询以”asd“开头,字符个数为6的所有数据(查询条件中asd后面是3个"_"):

stock_analysis_data=# select * from users where tag like 'asd___';
 id |  tag   
----+--------
  2 | asdfgh
(1 row)

1.3 使用“\”进行转义

       当查询的字符串中如果包含了”%“或者”_“,可以使用”\“进行转义,比如查询第4个字符为”%“的所有数据:

stock_analysis_data=# select * from users where tag like 'asd\%%';
 id |   tag   
----+---------
  7 | asd%hjk
(1 row)

1.4 使用“ESCAPE”自定义转义字符

       除了使用"\"进行转义之外,还可以使用escape自定义转义字符,比如还是上面的例子,查询第4个字符为”%“的所有数据,但是使用@作为转义字符:

stock_analysis_data=# select * from users where tag like 'asd@%%' escape '@';
 id |   tag   
----+---------
  7 | asd%hjk
(1 row)

       又或者,查询字符串中以”\“开头的数据:

stock_analysis_data=# select * from users where tag like '@\%' escape '@';
 id |  tag   
----+--------
  9 | \ashjk
(1 row)

1.5 使用ILIKE查询时忽略大小写

       ILIKE是Postgresql提供的,但是在标准SQL中没有提供的匹配操作符,和LIKE不同,使用ILIKE查询时忽略大小写,比如下面的例子,查询以asd开头的所有数据,并忽略大小写:

stock_analysis_data=# select * from users where tag ilike 'asd%';
 id |    tag     
----+------------
  1 | asdfghjkl
  2 | asdfgh
  4 | asdfasd
  7 | asd%hjk
  8 | asd_}}hjk
 10 | ASDsdsfdfg
 11 | ASD123sd
(7 rows)

二、similar to操作符

       在SQL99的标准中增加了similar to操作符,这个操作符可以像like一样进行使用,也可以使用正则表达式。

2.1 similar to代替LIKE

       下面,我们使用similar to查询使用like时的那几个例子。

       查询以“asd”开头的所有数据:

stock_analysis_data=# select * from users where tag similar to 'asd%';
 id |    tag    
----+-----------
  1 | asdfghjkl
  2 | asdfgh
  4 | asdfasd
  7 | asd%hjk
  8 | asd_}}hjk
(5 rows)

       从上面的查询结果中,也可以看到,similar to匹配时无法忽略大小写,大小写要严格和查询条件一致。

       使用similar to时同样支持转义字符,查询第4个字符为”%“的所有数据:

stock_analysis_data=# select * from users where tag similar to 'asd\%%';
 id |   tag   
----+---------
  7 | asd%hjk
(1 row)

2.2 similar to后接正则表达式

       similar to除了可以代替LIKE操作符之外,还可以后接正则表达式。比如正则表达式‘(z|a)\S*’表示查询以z或者a开头,任意长度的字符串,可以使用similar to后接该正则表达式进行查询:

stock_analysis_data=# select * from users where tag similar to '(z|a)\S*';
 id |    tag    
----+-----------
  1 | asdfghjkl
  2 | asdfgh
  3 | zxcvsdf
  4 | asdfasd
  7 | asd%hjk
  8 | asd_}}hjk
(6 rows)

       查找以asd开头和结尾的所有数据:

stock_analysis_data=# select * from users where tag similar to 'asd\S*asd';
 id |   tag   
----+---------
  4 | asdfasd
(1 row)

三、~等操作符直接匹配正则表达式

       除了LIKE、ILIKE和similar to,Postgrsq还支持以下四个操作符,直接作用于正则表达式:

  • ~:匹配正则表达式,区分大小写
  • ~*:匹配正则表达式,不区分大小写
  • !~:不匹配正则表达式,区分大小写
  • !~*:不匹配正则表达式,不区分大小写

       查询以asd开头的所有数据,忽略大小写:

stock_analysis_data=# select * from users where tag ~* 'asd\S*';
 id |    tag     
----+------------
  1 | asdfghjkl
  2 | asdfgh
  4 | asdfasd
  7 | asd%hjk
  8 | asd_}}hjk
 10 | ASDsdsfdfg
 11 | ASD123sd
(7 rows)

       这里使用的~*操作符,所以查询出来的结果忽略了大小写。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐