带有 IS NULL 的 CASE 不起作用

CASE with IS NULL not working

如果值是 NULL 我想给列一些值,我试过如下

insert into inward_doc_tracking_trl 
    (Mkey,Entry_Sr_No,N_UserMkey,N_Department,CStatus_Flag,Remarks,     
    CUser_Id,
    U_Datetime,NStatus_Flag,Delete_Flag, 
    CDept_Id,
    Ref_Mkey,No_Of_Days,Approved_Amount,Chq_No,Chq_dated,Chq_Bank,Chq_Amount,
    Vendor_MKey,Vendor_Comp_Mkey,Project_Mkey,Program_mkey,Payment_MKey,Due_Date,Updated_Remarks,Updated_Bill_no,
    Updated_Bill_Date,Updated_Bill_Amt,Party_Name,Acc_mkey,
    TotalDeductions,Broker_Mkey,Customer_Mkey,Payable_Amt,Balance_Amt)

     values (@inv_trl_mkey,@entry_sr_no,@Nuser_mkey,@n_department,@nstatus_flag2,@remarks,               
        CASE WHEN (@cuserid IS NULL) THEN 'YES' ELSE 'NO' END AS @cuserid,
    @u_datetime,@nstatus_flag,@delete_flag,     
        CASE WHEN (@cdept_id IS NULL) THEN 'YES' ELSE 'NO' END AS @cdept_id,
    @inv_hdr_mkey,@No_Of_Days,
     @Approved_Amount,@Chq_No,@Chq_dated,
     @Chq_Bank,@Chq_Amount,@Vendor_MKey,@Vendor_Comp_Mkey,@Project_Mkey,@Program_mkey,@Payment_MKey,@Due_Date  
    ,@Updated_Remarks,@Updated_Bill_no,@Updated_Bill_Date,@Updated_Bill_Amt,@Party_Name,
    @Acc_mkey,@TotalDeductions,@Broker_Mkey,@Customer_Mkey,@Payable_Amt,@Balance_Amt)  

但出现错误

Incorrect syntax near the keyword 'AS'.

如错误所示,问题与 CASE 无关,而与 AS 有关。因此,删除 AS:

 values (@inv_trl_mkey, @entry_sr_no, @Nuser_mkey, @n_department, @nstatus_flag2 ,@remarks,               
    (CASE WHEN (@cuserid IS NULL) THEN 'YES' ELSE 'NO' END),
     @u_datetime,@nstatus_flag,@delete_flag,     
    (CASE WHEN (@cdept_id IS NULL) THEN 'YES' ELSE 'NO' END),
    . . . 

VALUES() 子句中命名表达式的值没有意义。

从您的查询中删除 "AS",因为您要在 table 中插入,因此不再需要它。

 CASE WHEN (@cuserid IS NULL) THEN 'YES' ELSE 'NO' END

如果我没理解错的话,您使用的是 VALUES 中声明的变量值。如果你在那里做一些计算,你不应该命名这个。

AS @cuserid

无论如何:您不能这样命名任何表达式!

你必须区分

  • 使用变量的值并且
  • 给表达式起一个别名

VALUES 中,您只给出了一个值列表:

VALUES(@var1,@var2,@var3+5)

将使用 @var1@var2 的值,并将使用 var3 进行一些计算。 这里不需要任何别名

更新

您可以考虑在为变量设置值的地方执行此逻辑 @cuserid。在这种情况下,您可以在 VALUES 中使用此变量,而不必担心是否为 NULL...

插入到inward_doc_tracking_trl (Mkey,Entry_Sr_No,N_UserMkey,N_Department,CStatus_Flag,备注,
CUser_Id, U_Datetime,NStatus_Flag,Delete_Flag, CDept_Id, Ref_Mkey,No_Of_Days,Approved_Amount,Chq_No,Chq_dated,Chq_Bank,Chq_Amount, Vendor_MKey,Vendor_Comp_Mkey,Project_Mkey,Program_mkey,Payment_MKey,Due_Date,Updated_Remarks,Updated_Bill_no, Updated_Bill_Date,Updated_Bill_Amt,Party_Name,Acc_mkey, TotalDeductions,Broker_Mkey,Customer_Mkey,Payable_Amt,Balance_Amt) Select (@inv_trl_mkey,@entry_sr_no,@Nuser_mkey,@n_department,@nstatus_flag2,@remarks,
CASE WHEN (@cuserid IS NULL) THEN 'YES' ELSE 'NO' END AS cuserid, @u_datetime,@nstatus_flag,@delete_flag,
CASE WHEN (@cdept_id IS NULL) THEN 'YES' ELSE 'NO' END AS cdept_id, @inv_hdr_mkey,@No_Of_Days, @Approved_Amount,@Chq_No,@Chq_dated, @Chq_Bank,@Chq_Amount,@Vendor_MKey,@Vendor_Comp_Mkey,@Project_Mkey,@Program_mkey,@Payment_MKey,@ Due_Date
,@Updated_Remarks,@Updated_Bill_no,@Updated_Bill_Date,@Updated_Bill_Amt,@Party_Name, @Acc_mkey,@TotalDeductions,@Broker_Mkey,@Customer_Mkey,@Payable_Amt,@Balance_Amt) 强文本

你的陈述是正确的,如果你需要使用 AS,请不要将 AS 与 case 一起使用,而不是在 case 语句中使用块作为Abihabi87 说。最重要的一点是,当列数据类型为数字时,您不能在列内保存 varchar 数据。为此,您需要更改列的数据类型或在列内保存数值。例如你使用 'Yes/No' 而不是你可以使用 '0/1'.