我有一个Postgres sql,它有两列都包含相同的名称数据,其中的部分用字母大小写区分。例如:
col1 col2
johnSmith johnSmith
我希望col1只是"john"
而col2只是"Smith"
。
名称部分之间的区分是第一个大写字母。
答案 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