更新复合列

时间:2018-03-07 12:19:21

标签: sql postgresql

我只想用其他列的值填充my_table的column7,因此column7-value的结果如下所示:86 | WWB | 2014或86 | WWB | - 如果column3的值为0.这是我的SQL :

UPDATE public.my_table
SET column7 =   
case when column1 IS NULL then '-' else column1 end   
|| '|' || 
case when column2 IS NULL then '-' else column2 end    
|| '|' || 
case when column3 = '0' then '-'  else column3 end 


error: invalid input syntax for integer: "_"

问题在于最后一个case-row,因为column3是整数。 Column1和column2是bpchar,column3是int2。 有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

您正在进行类型冲突。在Postgres中很容易转换:

UPDATE public.my_table
    SET column7 = (coalesce(column1::text, '-') || '|' || 
                   coalesce(column2::text, '-') || '|' || 
                   (case when column3 = 0 then '-' else column3::text end)
                  ); 

答案 1 :(得分:1)

使用concat会使这更容易阅读,它会自动将所有内容转换为文本。但是case语句需要为所有分支生成相同的数据类型,因此text仍需要转换为column3

UPDATE public.my_table
  SET column7 = concat( 
                   coalesce(column1, '-'), '|'
                   coalesce(column2, '-'), '|'
                   case when coalesce(column3,0) = 0 then '-' else column3::text end
                );