Отображение значений без таблицы - PullRequest
5 голосов
/ 23 мая 2011

Мне нужно использовать карту, чтобы присвоить определенное значение year на основе значения, которое имеет year_code. На данный момент у меня есть большое заявление if, которое, очевидно, трудно поддерживать.

IF year_code = 'Y' THEN year := 2000; END IF;
IF year_code = '1' THEN year := 2001; END IF;
IF year_code = '2' THEN year := 2002; END IF;
-- and so on

Очевидным решением будет использование таблицы и выбор значения, однако я получил указание хранить все это в одной функции postgres, чтобы сделать это быстро. Позже я планирую хранить все это в таблицах.

Так есть ли способ, которым я могу создать временную карту и выбрать из нее форму, чтобы получить значение для года. На самом деле я просто хочу убрать этот уродливый код. Спасибо.

Ответы [ 3 ]

12 голосов
/ 23 мая 2011

Использование Общего выражения таблицы (CTE) в вашей функции упростит замену CTE на базовую таблицу позже, например.

WITH YearCodes (year_code, year) AS
     ( SELECT year_code, year
         FROM ( VALUES ( 'Y', 2000 ), 
                       ( '1', 2001 ), 
                       ( '2', 2002 ) ) 
              AS YearCodes ( year_code, year ) )
SELECT ...;

В качестве альтернативы, производная таблица:

SELECT *
  FROM ( VALUES ( 'Y', 2000 ), 
                ( '1', 2001 ), 
                ( '2', 2002 ) ) 
       AS YearCodes ( year_code, year )
       -- other stuff here;

Возможно, что более поздняя базовая таблица может быть календарной таблицей .

4 голосов
/ 23 мая 2011

Быстрое и грязное решение было бы большим уродливым утверждением 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;

Я думаю, это вопрос того, какой вид уродливого хака вы хотите.

3 голосов
/ 23 мая 2011

Я бы посоветовал вам создать временную таблицу и заполнить ее своими данными.Затем вы можете связать таблицы и преобразовать данные.Хотя это может показаться большой работой для одного оператора SQL, и могут быть более быстрые способы, это прекрасно настроит вас, когда вы будете готовы создать отдельную таблицу.Затем вы можете просто удалить оператор временной таблицы и операторы INSERT и просто изменить имя таблицы, на которую вы ссылаетесь, из временной таблицы на вновь созданную таблицу.

Единственное другое, достаточно чистое решение, которое я вижу, будетпреобразовать данные вместо использования оператора If.Например, если 2000 год является единственным, который представляет собой букву, вы можете сделать один оператор if, если это Y (и преобразовать его), а другой, если это не Y, тогда год 2000 + код_года,Если ваши годы совпадают так, это будет довольно простой способ сделать все на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...