SQL DB2 - можно сократить длинный список "случай когда"?

Иногда мои запросы имеют длинный случай, когда заявления. Например,

CASE WHEN BASE_YM = TO_CHAR(DEFAULT_YM,            'YYYYMM') THEN '00'
     WHEN BASE_YM = TO_CHAR(DEFAULT_YM - 1 MONTHS, 'YYYYMM') THEN '01'
     WHEN BASE_YM = TO_CHAR(DEFAULT_YM - 2 MONTHS, 'YYYYMM') THEN '02'
     .
     .
     .
     WHEN BASE_YM = TO_CHAR(DEFAULT_YM - 35 MONTHS, 'YYYYMM') THEN '35'
     WHEN BASE_YM = TO_CHAR(DEFAULT_YM - 36 MONTHS, 'YYYYMM') THEN '36'

Этот случай, когда само утверждение занимает 37 строк, и мне было интересно, может быть, есть ли способ сократить случай, когда утверждение с использованием i=00, ..., 36 что-то в этом роде?

2 ответа

Решение

Кажется, что все, что ты действительно делаешь, это выясняешь, сколько месяцев между BASE_YM а также DEFAULT_YMи делая это типом персонажа. Я думаю, что тот же самый результат может быть получен с помощью некоторой математики даты (и я предполагаю, что это было бы более эффективно, потому что это не должно было бы вычислять до 36 различных TO_CHAR звонки) Все это заявление заменит CASE, Я протестировал похожую логику в DB2 для Linux/Unix/Windows v.9.7 и z/OS v10:

SELECT 
    LPAD(
        ABS(
            MONTH(
                TIMESTAMP_FORMAT(BASE_YM, 'YYYYMM') - 
                DEFAULT_YM
            )
        )
    ,2,'0')
FROM your_table

Я добавил дополнительный интервал, чтобы вы (надеюсь) могли следовать немного легче. В основном это только вычитает DEFAULT_YM из преобразованной формы BASE_YM, Затем я беру Абсолютное значение разницы в месяцах, а затем преобразовываю его в заполненное нулями поле символов.

Создать новую таблицу с 2 столбцами, содержащими ваши 36 строк различных значений, а затем присоединиться к ней? это исключит необходимость в постановке дела вообще

Другие вопросы по тегам