简体   繁体   中英

case statement with in case statement

I am not sure what kind of statement I need in order for what i need to do. I would like to add a case statement after the case statement i currently have. Bellow is the case statement.

CASE
    WHEN LOCOFF.EXT_SRV_POLYGON IN ('BOF', 'CDA', 'COL', 'DAC', 'GOS', 'KEL', 'KLF', 'LAG', 'LEC', 'MED', 'PUM', 'RIT', 'ROS', 'SAN', 'SPO')
    THEN 'GAS'
    WHEN LOCOFF.EXT_SRV_POLYGON IN ('CDC', 'COC', 'DAV', 'DPC', 'GRC', 'KEC', 'LCC', 'OTC', 'PAC', 'SAC', 'SPC')
    THEN 'ELECTRIC'
    ELSE 'MISSING'
  END AS TYPE, 

I would like to say if EXT_Distworktype is GC or GT and the TYPE is ELECTRIC, GIVE ME TYPE THAT SAYS WRONG POLYGON OR IF THE EXT_DISTWORKTYPE is EC, ES, or ET and Type is GAS then give me a TYPE that say WRONG POLYGON.

here is my full query:

SELECT WO.WONUM AS "Work Order",
  WO.LOCATION   AS "Location",
  WO.STATUS     AS "Status",
  WO.DESCRIPTION,
  WO.ACTFINISH AS "Actual Finish",
  WO.PARENT    AS "Parent WO",
  WO.WORKTYPE  AS "Work Type",
  CASE
    WHEN WO.REPORTDATE IS NULL
    THEN TO_DATE('29-JAN-15 00:00:00', 'DD-MON-YY HH24:MI:SS')
    ELSE WO.REPORTDATE
  END       AS "Reported Date",
  WO.SITEID AS "Site",
  CASE
    WHEN WO.ACTFINISH IS NULL
    THEN GREATEST(TRUNC(TO_DATE(SysDate, 'DD-MON-YY HH24:MI:SS')      - TO_DATE(WO.REPORTDATE, 'DD-MON-YY HH24:MI:SS'), 6), 0)
    WHEN WO.STATUS NOT                                               IN ('COMP')
    THEN GREATEST(TRUNC(TO_DATE(SysDate, 'DD-MON-YY HH24:MI:SS')      - TO_DATE(WO.REPORTDATE, 'DD-MON-YY HH24:MI:SS'), 6), 0)
    WHEN WO.STATUS                                                   IN ('COMP')
    THEN GREATEST(TRUNC(TO_DATE(WO.ACTFINISH, 'DD-MON-YY HH24:MI:SS') - TO_DATE(WO.REPORTDATE, 'DD-MON-YY HH24:MI:SS'), 6), 0)
  END AS "Age",
  WO.EXT_DISTWORKTYPE,
  LOCOFF.EXT_OFFICE,
  CASE
    WHEN LOCOFF.EXT_SRV_POLYGON IN ('BOF', 'CDA', 'COL', 'DAC', 'GOS', 'KEL', 'KLF', 'LAG', 'LEC', 'MED', 'PUM', 'RIT', 'ROS', 'SAN', 'SPO')
    THEN 'GAS'
    WHEN LOCOFF.EXT_SRV_POLYGON IN ('CDC', 'COC', 'DAV', 'DPC', 'GRC', 'KEC', 'LCC', 'OTC', 'PAC', 'SAC', 'SPC')
    THEN 'ELECTRIC'
    ELSE 'MISSING'
  END AS TYPE,
  LOCOFF.EXT_STATECODE,
  WO.OWNERGROUP,
  WO.EXT_JOBCODE
FROM LOCATIONS LOCOFF
RIGHT JOIN WORKORDER WO
ON WO.LOCATION       = LOCOFF.LOCATION
WHERE WO.STATUS NOT IN ('CLOSE', 'WAIV', 'CAN', 'REJ', 'REVOKED')
AND LOCOFF.SITEID    = 'OPS'
AND WO.EXT_JOBCODE NOT LIKE 'A%' AND WO.E`enter code here`XT_JOBCODE NOT LIKE 'B%'
AND WO.EXT_JOBCODE NOT IN ('K008','K009','I006','I007','I008');

You can nest case expressions if you only want to modify the existing column value (rather than adding a separate column with the 'wrong polygon' message):

CASE
    WHEN LOCOFF.EXT_SRV_POLYGON IN ('BOF', 'CDA', 'COL', 'DAC', 'GOS', 'KEL', 'KLF', 'LAG', 'LEC', 'MED', 'PUM', 'RIT', 'ROS', 'SAN', 'SPO')
    THEN
        CASE
            WHEN WO.EXT_DISTWORKTYPE IN ('EC', 'ES', 'ET')
            THEN 'WRONG POLYGON'
            ELSE 'GAS'
        END
    WHEN LOCOFF.EXT_SRV_POLYGON IN ('CDC', 'COC', 'DAV', 'DPC', 'GRC', 'KEC', 'LCC', 'OTC', 'PAC', 'SAC', 'SPC')
    THEN
        CASE
            WHEN WO.EXT_DISTWORKTYPE IN ('GC', 'GT')
            THEN 'WRONG POLYGON'
            ELSE 'ELECTRIC'
        END
    ELSE 'MISSING'
  END AS TYPE, 

Quick SQL Fiddle demos with the same made-up data; your original case and this nested case , which gives:

EXT EX TYPE        
--- -- -------------
BOF GC GAS          
CDA GT GAS          
SPO ES WRONG POLYGON
CDC EC ELECTRIC     
COC ET ELECTRIC     
SPC GC WRONG POLYGON

This is a bit simpler than trying to do a second step that interprets the TYPE value, because you can't refer to a column alias in the same level of query; you would need to make your existing query into an inline view.

Will an extra case not do it?

CASE
  WHEN WO.EXT_DISTWORKTYPE IN ('GC', 'GT') 
  AND LOCOFF.EXT_SRV_POLYGON IN ('CDC', 'COC', 'DAV', 'DPC', 'GRC', 'KEC', 'LCC', 'OTC', 'PAC', 'SAC', 'SPC') --electronic
  THEN 'WRONG POLYGON'
CASE 
  WHEN WO.EXT_DISTWORKTYPE IN ('EC', 'ES', 'ET' ) 
  AND LOCOFF.EXT_SRV_POLYGON IN ('BOF', 'CDA', 'COL', 'DAC', 'GOS', 'KEL', 'KLF', 'LAG', 'LEC', 'MED', 'PUM', 'RIT', 'ROS', 'SAN', 'SPO') --gas
  THEN 'WRONG POLYGON'
ELSE 'MSSING'
END AS YOURANSWER,

You could do an case within a case

CASE 
  WHEN (TRUE) THEN
    CASE WHEN (true) THEN 'a' ELSE 'b' END
  ELSE 
     'A' 
END

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM