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 строк различных значений, а затем присоединиться к ней? это исключит необходимость в постановке дела вообще