注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

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

2012-07-26 14:05:28|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

         今天有开发人员问到: PostgreSQL 中是否有函数可以判断一个字符串中是否包含指定字符,如果包

含则返回 ture ,否则返回 false,例如,如果字符串 'abcde' 中包含 'ab' 则返回 true,于是想了想,共总

结以下三种方法,暂且不考虑性能。


--创建测试表

 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 函数

 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

 francs=> select position('bc' in 'bcd');
 position
----------
        1
(1 row)
   

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


二 方法二:使用正责表达式
--2.1 使用正责表达式

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

   备注:上面使用的是正责表达式,关于正责表达式的更多用法,请参考手册
             http://www.postgresql.org/docs/9.2/static/functions-matching.html
             也可以参考之前的 blog
              http://francs3.blog.163.com/blog/static/4057672720112221400871/

 

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

 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

 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

 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

  评论这张
 
阅读(26665)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016