如何设置"UPDATE SET NOT NULL"



我对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 '%/%';

如果我一个接一个地运行它们,它们就会相互覆盖。我该如何预防?

关于

Andrey

您需要一个条件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子句对于只选择那些实际要更改的行非常重要。性能是一个原因,正确性是另一个原因。如果忽略这一点,如果hausnummer与任何条件都不匹配,那么CASE语句将返回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 '%/%';

最新更新