我有三列:
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
答案 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
对于数字长度相同(且相同)的情况,这将起作用,因为内部替换将做你想要的。