Postgresql:选择没有给定子串的字符串

时间:2016-05-23 10:45:59

标签: postgresql

我有三列:

Name           | Number  | Number2
abc $18 12mb   | $18     | 12mb
10mb 1cd $19   | $19     | 10mb
$15 30mb ab123 | $15     | 30mb

我想创建列:new_name作为名称,不带数字和number2。有什么想法吗?

预期产出:

Name      | Number  | Number2
abc       | $18     | 12mb
1cd       | $19     | 10mb
ab123     | $15     | 30mb

2 个答案:

答案 0 :(得分:2)

一种方法使用replace()

select trim(both ' ' from replace(name, Number, ''))

答案 1 :(得分:1)

嵌套你的替换语句。简单的方法:

alter table mytable add new_name text;

update mytable set new_name =     
trim(both ' ' from replace(replace("name", "Number", ''),"Number2", ''))

请注意,这对于任何列为null的情况都不起作用。 Hanlde使用coalesce()进行空值:

update mytable set new_name =     
    trim(both ' ' from replace(replace("name", coalesce("Number",''), ''),coalesce("Number2",''), ''))

如果Number是Number2的子字符串,则仍然会失败,因为内部替换将替换Number2部分的那个位,而外部替换将不会执行任何操作。您可以采用一种在所有情况下都应该起作用的更复杂的方式:

-- replace the longer string first
 update mytable set new_name =     
 CASE WHEN coalesece(length("Number"),0) > coalesce(length("Number2"),0) THEN 
    trim(both ' ' from replace(replace("name", coalesce("Number",''), ''),coalesce("Number2",''), ''))
 ELSE
    trim(both ' ' from replace(replace("name", coalesce("Number2",''), ''),coalesce("Number",''), ''))
END

对于数字长度相同(且相同)的情况,这将起作用,因为内部替换将做你想要的。