0

我的表格包含以下字段。

id、user_id、shipping_type、inv_type、invoice_no。

inv_type 是 ENUM(本地/国际)。

我想得到每一行的发票号。如果 inv_type = 'local' 那么我希望 invoice_no 有 'local_inv_no' 作为别名,如果是国际然后 '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'
        ";

但它似乎没有给我结果。

4

2 回答 2

3

我理解你的问题,就像你想要两列一样,对吧?然后不要把它放在一个中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>)

于 2013-08-29T12:59:54.993 回答
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”。但这将是使用 Mimer SQL 检查的完整的 SQL 语句

于 2013-08-29T13:08:51.543 回答