Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
714 views
in Technique[技术] by (71.8m points)

sql - Case Statement with different data type

I am trying to return SLA days for particular conditions. However for a specific condition I want it to return a different data type. Current code is as follows:

      SELECT CASE
               WHEN fourthlevel.case_type IN
                       ('Complaint')
               THEN
                  (SELECT COUNT (*)
                     FROM work_days1
                    WHERE     work_days1.business_date >
                                 fourthlevel.cdate
                          AND work_days1.business_date <=
                                 COALESCE (fourthlevel.close_date,
                                           SYSDATE))
               WHEN fourthlevel.case_type IN ('Enquiry')
               THEN
                  (SELECT COUNT (*)
                     FROM work_days1
                    WHERE     work_days1.business_date >
                                 fourthlevel.create_date
                          AND work_days1.business_date <=
                                 COALESCE (fourthlevel.close_date,
                                           SYSDATE))
            END
               AS sla_days
       FROM fourthlevel

I want it to return for where case_status = 'Cancelled' return 'N/A'. I know i cant do it like this but i will include the code so it is easier to understand:

    SELECT CASE
      WHEN fourthlevel.case_type IN ('Complaint')
      THEN
         (SELECT COUNT (*)
            FROM work_days1
           WHERE     work_days1.business_date > fourthlevel.cdate
                 AND work_days1.business_date <=
                        COALESCE (fourthlevel.close_date, SYSDATE))
      WHEN fourthlevel.case_type IN ('Enquiry')
      THEN
         (SELECT COUNT (*)
            FROM work_days1
           WHERE     work_days1.business_date > fourthlevel.create_date
                 AND work_days1.business_date <=
                        COALESCE (fourthlevel.close_date, SYSDATE))
      WHEN fourthlevel.case_status = 'Cancelled'
      THEN
         'N/A'
   END
      AS sla_days
    FROM fourthlevel

How do i do this?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

A case statement can only return one data type. So convert the numbers to strings:

SELECT CASE
  WHEN fourthlevel.case_type IN ('Complaint')
  THEN
     (SELECT cast(COUNT(*) as varchar2(255))
        FROM work_days1
       WHERE     work_days1.business_date > fourthlevel.cdate
             AND work_days1.business_date <=
                    COALESCE (fourthlevel.close_date, SYSDATE))
  WHEN fourthlevel.case_type IN ('Enquiry')
  THEN
     (SELECT cast(COUNT(*) as varchar2(255))
        FROM work_days1
       WHERE     work_days1.business_date > fourthlevel.create_date
             AND work_days1.business_date <=
                    COALESCE (fourthlevel.close_date, SYSDATE))
  WHEN fourthlevel.case_status = 'Cancelled'
  THEN
     'N/A'
END AS sla_days
FROM fourthlevel

Alternatively, you could return NULL when the two conditions do not match.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...