【问题标题】:CASE with IS NULL not workingIS NULL 的 CASE 不起作用
【发布时间】:2016-08-19 11:46:03
【问题描述】:

如果值为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)  

但出现错误

关键字“AS”附近的语法不正确。

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    从查询中删除“AS”,因为您将在表中插入,因此不再需要。

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

    【讨论】:

    • 得到错误Error converting data type varchar to numeric.
    • 似乎您的列/参数值类型之一是字符串,您将插入“整数”类型列
    • 我的cuserid 列是数字
    • 因此您不能在该列中存储“是/否”
    • 您必须在该列中存储任何整数值 0/1 或根据您的要求的其他值。
    【解决方案2】:

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

    AS @cuserid
    

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

    你必须区分

    • 使用变量的值并
    • 为表达式指定别名

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

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

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

    更新

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

    【讨论】:

    • 你是对的,所以我这样做了CASE WHEN (@cuserid IS NULL) THEN 0 ELSE @cuserid END,
    • 但它总是以0 的形式出现,即使 CUser_ID 是他们的
    • @stack 您在@cuserid 中的任何值都将在您的语句中使用。确定您设置此值的代码是正确的吗?
    【解决方案3】:

    正如错误所暗示的,问题与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() 子句中命名表达式的值是没有意义的。

    【讨论】:

    • 我在存储过程中使用它。这就是为什么像这样添加。现在出现错误,因为 Error converting data type varchar to numeric. CUser_ID 的数据类型是 numeric
    • 如果可行,您可以使用 0 或 1 代替“是”或“N”,因为它支持所有 varchar、float、numeric 等。
    【解决方案4】:

    插入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) 选择(@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) 强文本

    【讨论】:

      【解决方案5】:

      您的陈述是正确的,如果您需要使用 AS,请不要将 AS 与 case 一起使用,而不是像 Abihabi87 所说的那样在 case 语句中使用块强>。最重要的一件事是当列数据类型为数字时,您不能在列内保存 varchar 数据。为此,您需要更改列的数据类型或在列内保存数值。例如,您使用“是/否”而不是您可以使用“0/1”。

      【讨论】:

        猜你喜欢
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-13
        • 1970-01-01
        相关资源
        最近更新 更多