Быстрое и грязное решение было бы большим уродливым утверждением CASE:
CASE year_code
WHEN 'Y' THEN year := 2000
WHEN '1' THEN year := 2001
-- ...
ELSE year := NULL -- Or something else that makes sense or will
-- blow up so you know something is wrong.
END CASE;
Хотя я не знаю, лучше ли это, чем большая уродливая куча ПЧ.
Выможно использовать временную таблицу, но тогда вам придется где-то хранить большую уродливую кучу данных, и вам нужно будет проверить, существует ли временная таблица, и заполнить ее, если ее нет.
Выскажем, что у вас не установлено hstore
, вы могли бы подделать его с массивом PostgreSQL и циклом WHILE:
-- Untested "off the top of my head" code
array := ARRAY['Y', '2000', '1', '2001', /* ... */ ];
i := 1;
WHILE i <= array_length(array) LOOP
IF year_code = array[i] THEN
year := array[i + 1]::INTEGER;
EXIT; -- Found it so bust out of the loop.
ELSE
i := i + 2;
END IF;
END LOOP;
Я думаю, это вопрос того, какой вид уродливого хака вы хотите.