如何设置" UPDATE SET NOT NULL"

时间:2015-11-06 08:09:12

标签: sql postgresql sql-update

我对UPDATE语句有疑问:

UPDATE tmp_gelbe_seten SET haus_nr_von =  ubstring(hausnummer,'([0-9]*)') WHERE hausnummer like '%-%'; 

UPDATE tmp_gelbe_seten SET haus_nr_bis = substring(hausnummer,'-([0-9]*)') WHERE hausnummer like '%-%';

UPDATE tmp_gelbe_seten SET haus_nr_von = substring(hausnummer,'([0-9]*)') WHERE hausnummer like '%/%'; 

UPDATE tmp_gelbe_seten SET haus_nr_bis = substring(hausnummer,'/([0-9]*)') WHERE hausnummer like '%/%';

如果我一个接一个地运行它们而不是相互覆盖它们。我该如何预防?

问候

安德烈

1 个答案:

答案 0 :(得分:2)

您需要一个条件SET子句:

update tmp_gelbe_seten 
  set haus_nr_von = case 
                       when hausnummer like '%-%' then substring(hausnummer,'([0-9]*)') 
                       when hausnummer like '%/%' then substring(hausnummer,'([0-9]*)')
                    end,
      haus_nr_bis = case
                       when hausnummer like '%-%' then substring(hausnummer,'-([0-9]*)')
                       when hausnummer like '%/%' then substring(hausnummer,'/([0-9]*)')
                    end
where hausnummer like '%-%' 
   or hausnummer like '%/%';

请注意,where子句对于仅选择您想要更改的行非常重要。性能是另一个原因和正确性。如果将其保留,如果CASE与任何条件都不匹配,hausnummer语句将返回NULL。如果您执行保留where子句,则 添加ELSE部分,返回要更新的列,以便当前值为未更改else haus_nr_vonelse haus_nr_bis

由于haus_nr_von的表达式在两种情况下都相同,因此上述说法可简化为:

update tmp_gelbe_seten 
  set haus_nr_von = substring(hausnummer,'([0-9]*)'),
      haus_nr_bis = case
                       when hausnummer like '%-%' then substring(hausnummer,'-([0-9]*)')
                       when hausnummer like '%/%' then substring(hausnummer,'/([0-9]*)')
                    end
where hausnummer like '%-%' 
   or hausnummer like '%/%';