案例陈述中的多个条件

时间:2013-08-29 12:36:51

标签: mysql

我的桌子上面有以下字段。

  

ID,USER_ID,SHIPPING_TYPE,inv_type,invoice_no。

     

inv_type是ENUM(本地/国际)。

我希望获得每行的发票号。如果inv_type ='local',那么我希望invoice_no将'local_inv_no'作为别名,如果是international,则将'int_inv_no'作为别名。 如果其中一个是Null,那么我希望'local_inv_no'为null或int_inv_no为结果中的null,

以下是我最近的尝试。

 $sql = "select case when b.inv_type='local' 
        then (case when b.invoice_no is NULL then 'n' else b.invoice_no end 'local_inv')
        else 
        when n.inv_type='int' then (case when b.invoice_no is NULL then 'n' else b.invoice_no end 'int_inv')
        end 'inv_status'
        from user_invoice b
        where b.user_id = '$active_id'
        ";

但它似乎没有给我结果。

2 个答案:

答案 0 :(得分:3)

我理解你的问题就像你想要2列一样,对吧?然后不要将它放在一个case when中,因此会产生一列。

select
if(b.inv_type='local', coalesce(b.invoice_no, 'n'), NULL) as local_inv_no,
if(b.inv_type='international', coalesce(b.invoice_no, 'n'), NULL) as int_inv_no
from user_invoice b
where b.user_id = '$active_id'

coalesce()函数是case when构造的简短形式。它只返回其第一个参数not null

if()的写入量比case when少一点,因为其参数为if(<what_to_check>, <then>, <else>)

答案 1 :(得分:0)

看起来很混乱。

由于我知道你试图做什么,我会尽力重建一份有效的声明

select 

case when b.inv_type='local' 
        then (
              case when b.invoice_no is NULL 
              then 
                  'n' 
              else 
                  b.invoice_no 
              end)
        else
        (
        case when n.inv_type='int' 
          then 
            (
             case when b.invoice_no is NULL 
                 then 
                    'n' 
                 else 
                    b.invoice_no 
                 end
                 )

        end
        )
end
from user_invoice b
where b.user_id = '$active_id'

我无法弄清楚为什么你的陈述中有'inv_status'和'int_inv'。 但这将是一个完全正常工作的SQL语句,与Mimer SQL一起检查