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