Выберите схему и таблицу динамически в соответствии с параметром - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть группа таблиц, в которых хранятся почтовые индексы разных стран.Каждая таблица (называемая postal_codes) страны находится в отдельной схеме, например: zone_us, zone_uk, zone_fr и т. Д. У меня есть таблица в общедоступной схеме, в которой хранятся идентификаторы всех почтовых индексов вместе с кодом страны (нас,Великобритания, фр, ...).При запросе идентификатора почтового индекса (public.postal_codes) запрос должен также вернуть запись своего почтового индекса в схеме, связанной со страной происхождения.

Например:

таблица public.postal_codes

id  country  zone_code_id
1   us       2
2   uk       4
3   uk       2
4   fr       9

таблица zone_us.postal_codes

id   code      address
2    3454355   Example Street X

таблица zone_uk.postal_codes

id   code      address
2    9845654   Example Street X
4    7845654   Example Street Z

таблица zone_fr.postal_codes

id   code      address
9    9456546   Example Street X

Запрос должен проверить, существует ли таблица для зоны (zone_ [country_code] .postal_codes), если да, то вернуть соответствующую строку, если нет, сделать запрос в зоне по умолчанию (zone_default.postal_codes).

Спасибо за помощь!

1 Ответ

0 голосов
/ 12 декабря 2018

Я создал функцию для решения своей проблемы, но я не знаю, является ли это наиболее эффективным способом.Если у кого-то есть лучшее предложение.

CREATE OR REPLACE FUNCTION public.get_zone_postal_code("country_code" VARCHAR, "code_id" INT4) RETURNS SETOF RECORD
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
   schema_name varchar := 'zone_br';
BEGIN 
    IF EXISTS(SELECT 1 FROM information_schema.tables WHERE  table_schema = 'zone_' || country_code and table_name = 'postal_codes') THEN
        schema_name := 'zone_' || country_code;
    END IF;
    RETURN QUERY EXECUTE FORMAT('SELECT code FROM %I.postal_codes WHERE id = %s', schema_name, code_id);
END 
$BODY$;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...