2011-05-23 3 views
3

Мне нужно использовать карту для присвоения определенного значения 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 ради того, чтобы быть это было сделано быстро. Позже я планирую хранить все это в таблицах.

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

+0

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

+0

Хотел бы я, и буду делать это позже. Но мне сейчас поручено сделать что-то быстро грязное. – Keyo

+0

@mu Похож на хороший инструмент. Однако 'type" hstore "не существует'. – Keyo

ответ

9

Использование функции Common Table Expression (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; 

Возможно, что позже базовая таблица может быть calendar table.

+0

Отлично, именно то, что я искал. – Keyo

+0

Мне сообщили, что некоторые узлы базы данных находятся на PostgreSQL 8.1, и это не сработает. :( – Keyo

+0

@Keyo: как насчет производной таблицы? Я обновил свой ответ. – onedaywhen

3

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

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

3

Быстрое и грязное решение будет большой уродливый сазе:

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; 

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

+1

Если OP должен использовать временную таблицу, вероятно, имеет смысл просто использовать таблицу.(Обычная базовая таблица, а не временная таблица.) –

+0

@Catcall: Я бы, вероятно, тоже использовал таблицу, но я только упомянул об этом, потому что кто-то ее поднял, и я хотел добавить некоторые оговорки. –

Смежные вопросы