带有 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'.
如果值是 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'.