Как заменить названия региона с неполного на полное
имеется проблема в анализе данных по регионам, а именно названия регионов в разных таблицах разная (Коми, Коми республика и т.д.). Я хочу привести их стандартному виду, с полным названием и указанием типа субъекта РФ - Ресбулика Коми, Архангельская область и т.д.
Первое что пришло в голову, это написать такой триггер:
CREATE OR REPLACE FUNCTION replace_region()
RETURNS TRIGGER AS $$
BEGIN
regions
NEW.region_delivery = CASE
WHEN NEW.region_delivery = 'Краснодарский' THEN 'Краснодарский край'
WHEN NEW.region_delivery = 'Ставропольский' THEN 'Ставропольский край'
WHEN NEW.region_delivery = 'Адыгея' THEN 'Республика Адыгея'
WHEN NEW.region_delivery = 'Волгоградская' THEN 'Волгоградская область'
...
ELSE NEW.region_delivery
END;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER before_insert_replace_region
BEFORE INSERT ON sales
FOR EACH ROW
EXECUTE FUNCTION replace_region();
Если бы во всех таблицах были одинаковые отличия от стандартного вида, то в целом, мне бы сошло и так, но таблиц 4 и далее будет только больше и для каждой проверять условия замены выглядит не оптимальным. Так же я не думаю что быстродействие такого способа удобоваримая. Как можно сделать это лучше?
В контексте вопроса уточню, что таблицы в которых нужна замена названия регионов - таблицы продаж, в которых есть столбец "регион". Так же имеется таблица с субъектами РФ. В ней присутствуют как полное название в столбце "Наименование" так и короткое "Наименование без типа". Если это как то поможет..
Ответы (1 шт):
Как можно сделать это лучше?
Создаёте таблицу
CREATE TABLE replacement (
generic VARCHAR(128) PRIMARY KEY, -- это то, что может ввести юзер
canonical VARCHAR(128) NOT NULL -- это как должно быть
);
Заполняете (и постоянно пополняете, юзер - существо творческое)
INSERT INTO replacement VALUES
('Коми', 'Коми республика'),
('Коми республика', 'Коми республика'),
('Республика Коми', 'Коми республика');
Используете для замены
-- ...
SET NEW.region_delivery = COALESCE(
( SELECT canonical
FROM replacement
WHERE generic = NEW.region_delivery
),
NEW.region_delivery
);
Плюс введённые, но не найденные значения сохранять в отдельную таблицу - для пополнения таблицы замен. Увы, вручную...
Понятно, что показанное не отвечает требованиям нормализации. Но это только демонстрация - должна существовать таблица канонических названий (ФИАС/ГАР в помощь), и вместо поля canonical в таблице replacement будет ссылка.