如何使用postgresql函数在文本中找到第一个上部字符

时间:2017-01-17 13:10:21

标签: sql postgresql

我有一个Postgres sql,它有两列都包含相同的名称数据,其中的部分用字母大小写区分。例如:

col1         col2
johnSmith    johnSmith

我希望col1只是"john"而col2只是"Smith"

名称部分之间的区分是第一个大写字母。

4 个答案:

答案 0 :(得分:2)

试试这个:

update mytable set
col1 = regexp_replace(col1, '[A-Z].*', 'm'),
col2 = regexp_replace(col2, '^[a-z]*', '')

regexp_replace()的两次调用都会将删除部分作为目标,并通过替换为空(空白)来实现。

第一个正则表达式[A-Z].*匹配第一个大写字母及其后的所有内容。

第二个正则表达式^[a-z]*匹配字符串的开头,添加紧随其后的所有小写字母。

答案 1 :(得分:1)

使用两个函数,substring使用REGEX expresion来查找第一个大写字符,position将它返回到字符串中的位置。

select position((select substring('my Firts Uppercase', '([A-Z])')) in 'my Firts Uppercase');

答案 2 :(得分:1)

你也可以试试这个:

select t[1] as col1,t[2] as col2 from (
  select regexp_matches(login,'([a-z]*)([A-Z].*)') t from (
        select 'johnSmith'::character varying as login
 ) a 
 ) b

答案 3 :(得分:1)

使用substring和正则表达式。查询:

SELECT substring(a from '^[a-z]*'),  --select lower case letters from the start
       substring(b from '[A-Z].*')   --select Capital starting string from the end...
FROM t1                              --... ending with '.*$' would probably pay off

返回:

john | Smith

然后更新它:

UPDATE t1
SET a=substring(a from '^[a-z]*'),
    b=substring(b from '[A-Z].*')
FROM t1