I version 5 af DB2 kom der et nyt statement, nemlig CASE. CASE statementet findes i to varianter. En "simple when" og en "searched when".
Lad os starte med at kigge på en "simple when". Syntaksen er
<-----------------------------------------------+ >-CASE-expression---WHEN--expression--THEN----result-expression------> +-NULL--------------+ +-ELSE NULL---------------+ >--------+-------------------------+-----END-------------------------> +-ELSE--result-expression-+Lad os se et eksempel:
UPDATE KALENDERROLLE SET DATO = (CASE WHEN DATO > '2000-01-07' THEN DATO + 44 DAYS ELSE DATO + 46 DAYS END)Dette statement har vi brugt til at flytte datoen frem i forbindelse med en skudårstest. Nogle datoer i tabellen stod på fredag den 7-1-2000 andre på mandag den 10-1-2000. Begge datoer bliver til tirsdag den 22/2-2000. Hvis datoen er den 7-1-2000 lægges der 46 dage til, ellers lægges der 44 dage til.
Et andet eksempel på det "simple when" statement er oversættelse af koder.
SELECT PGM , CASE SPROG WHEN 'C' THEN 'COBOL' WHEN 'P' THEN 'PL/I' WHEN 'A' THEN 'ASSEM' ELSE NULL END FROM PROGRAMERHer oversætter vi sprogkoden i tabelen PROGRAMMER til COBOL, PL/I eller ASSEM, for henholdsvis C, P og A. ELSE statementet er ikke nødvendigt, NULL er default. Jeg har taget det med som dokumentation.
Syntaksen på en "searched when" er:
<-----------------------------------------------------+ ><-CASE---WHEN--search-condition--THEN----result-expression-----> +-NULL--------------+ +-ELSE NULL---------------+ >------------+-------------------------+-------END-------------> +-ELSE--result-expression-+Denne version af CASE statementet bruges i WHEN clausen. Lad os kigge på et eksempel:
SELECT CREATOR, NAME FROM SYSIBM.SYSTABLES WHERE (CASE WHEN (DAYS(CURRENT DATE) - DAYS(CURRENT DATE)/7*7) = 6 THEN CURRENT DATE - 2 DAYS WHEN (DAYS(CURRENT DATE) - DAYS(CURRENT DATE)/7*7) = 0 THEN CURRENT DATE - 3 DAYS ELSE CURRENT DATE - 1 DAYS) > DATE(STATSTIME)Meningen med queryen er at give navnet på de tabeller, hvor statestikkerne er ældre end igår. Dog hvis den køres i weekenden skal "igår" opfattes som fredag.
Alle tilfældene kunne være løst på andre måder. Vi har endnu ikke undersøgt, om der er nogen forskel på performance, om man bruger CASE istedet for en alternative måde. I hvert enkelt tilfælde må man vurdere, hvad der er vigtigst - læsbarhed eller performance - og derefter prøve sig frem. Dels kigge på explain, dels checke med stopur.
Hvis du også har et emne, du synes, vi skal tage op, er du også velkommen til at skrive til os.