2017-05-14 565 views
1

我知道这可能是一个简单的问题,但我在过去的一个小时里一直在困扰着这个问题,我不确定哪些术语可以准确地描述我正在尝试做什么。在SQL中如何使用多个case语句?

我正在使用Oracle 12C数据库的应用程序,我想在这个语句中使用多个案例的相同领域,例如。 INVC_TYPE= 0,2。第一种情况:如果它的2然后是QTY*-1,并且情况2:如果它的0然后是regular并且如果它的0然后return

所以请有任何人能帮助我:

select 
t.ITEM_SID, 
i.SBS_NO as INVC_SBS, 
i.STORE_NO as INVCSTORENO, 
s.STORE_NO as STORENO, 
s.STORE_CODE as STORECODE, 
s.STORE_NAME, 
i.INVC_NO, 
i.CREATED_DATE, 
i.INVC_SID, 
i.INVC_TYPE, 
i.CASHIER_ID, 
to_char(i.CREATED_DATE) as INVCDATE, 
t.ORIG_PRICE as INVCORIGPRICE, 
t.PRICE as INVCPRICE, 
t.COST as INVCCOST, 
case 
when i.INVC_TYPE=2 then t.QTY*-1 
else t.QTY 
end as INVCQTY 
case when i.INVC_TYPE=0 then i.INVC_TYPE="REGULAR" 
case when i.INVC_TYPE=2 then i.INVC_TYPE="RETURN" 
else 'NA' 
end as INVCTYPE 
from invoice i, invc_item t, SBS_STORE_LIST s 
where 
INVC_TYPE in (0,2) and 
i.invc_sid = t.invc_sid and 
i.STORE_NO = s.STORE_NO and 
i.REF_INVC_SID is null; 

回答

1

试试这个:

select t.ITEM_SID, 
    i.SBS_NO as INVC_SBS, 
    i.STORE_NO as INVCSTORENO, 
    s.STORE_NO as STORENO, 
    s.STORE_CODE as STORECODE, 
    s.STORE_NAME, 
    i.INVC_NO, 
    i.CREATED_DATE, 
    i.INVC_SID, 
    i.INVC_TYPE, 
    i.CASHIER_ID, 
    to_char(i.CREATED_DATE) as INVCDATE, 
    t.ORIG_PRICE as INVCORIGPRICE, 
    t.PRICE as INVCPRICE, 
    t.COST as INVCCOST, 
    case 
     when i.INVC_TYPE = 2 then t.QTY * - 1 
     else t.QTY 
     end as INVCQTY, 
    case 
     when i.INVC_TYPE = 0 then i.INVC_TYPE = 'REGULAR' 
     when i.INVC_TYPE = 2 then i.INVC_TYPE = 'RETURN' 
     else 'NA' 
     end as INVCTYPE 
from invoice i 
join invc_item t on i.invc_sid = t.invc_sid 
join SBS_STORE_LIST s on i.STORE_NO = s.STORE_NO 
where INVC_TYPE in (0, 2) 
    and i.REF_INVC_SID is null; 

另外,还要注意在基础连接部位逗号明确联接语法。总是使用这种语法,因为这是现代和清晰的。

+0

抱歉地说,它的显示同样的错误,遗漏的关键字? –

+0

@AbdulazizHasanAldabbagh - 已更新 – GurV

1

这些是您的代码的问题,首先。

  1. 2个case语句之间缺少逗号。
  2. 您在同一列中两次使用case关键字。
  3. THEN部分情况下,您正在分配一个值。您应该只返回一个值
  4. 不是一个错误,但你应该使用正确的联接语法

    select t.ITEM_SID, 
        i.SBS_NO as INVC_SBS, 
        i.STORE_NO as INVCSTORENO, 
        s.STORE_NO as STORENO, 
        s.STORE_CODE as STORECODE, 
        s.STORE_NAME, 
        i.INVC_NO, 
        i.CREATED_DATE, 
        i.INVC_SID, 
        i.INVC_TYPE, 
        i.CASHIER_ID, 
        to_char(i.CREATED_DATE) as INVCDATE, 
        t.ORIG_PRICE as INVCORIGPRICE, 
        t.PRICE as INVCPRICE, 
        t.COST as INVCCOST, 
        case 
         when i.INVC_TYPE = 2 
          then t.QTY * - 1 
         else t.QTY 
         end as INVCQTY, 
        case i.INVC_TYPE 
         when 0 then 'REGULAR' 
         when 2 then 'RETURN' 
         else 'NA' 
         end as INVCTYPE 
    from invoice i 
    join invc_item t 
        on i.invc_sid = t.invc_sid 
    join SBS_STORE_LIST s 
        on i.STORE_NO = s.STORE_NO 
    where INVC_TYPE in (0, 2) 
        and i.REF_INVC_SID is null;