MainframeSupports
tip uge 33/1999:

En af vores trofaste læsere har bedt os om at skrive lidt om nyhederne i DB2 version 5. Specielt var han interesseret i CASE statementet.

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 PROGRAMER
Her 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.

Sidste uges tip        Tip oversigten