Как заменить названия региона с неполного на полное

имеется проблема в анализе данных по регионам, а именно названия регионов в разных таблицах разная (Коми, Коми республика и т.д.). Я хочу привести их стандартному виду, с полным названием и указанием типа субъекта РФ - Ресбулика Коми, Архангельская область и т.д.

Первое что пришло в голову, это написать такой триггер:

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 шт):

Автор решения: Akina

Как можно сделать это лучше?

Создаёте таблицу

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 будет ссылка.

→ Ссылка