带IF或case的SQL选择
我正在使用SQLServer2008R2 我的SQL语句如下所示,用于在插入之前避免重复数据:带IF或case的SQL选择,sql,sql-server,if-statement,case,Sql,Sql Server,If Statement,Case,我正在使用SQLServer2008R2 我的SQL语句如下所示,用于在插入之前避免重复数据: select * from LETTRE_VOIT_TEMP where NOT EXISTS ( select * from LETTRE_VOIT_FINAL lv where lv.NOID = LETTRE_VOIT_TEMP.NOID AND lv.CODE_DEST = LETTRE_VOIT_TEMP.CODE_DEST AND lv.CODE_CLIENT =
select * from LETTRE_VOIT_TEMP where NOT EXISTS
(
select * from LETTRE_VOIT_FINAL lv
where lv.NOID = LETTRE_VOIT_TEMP.NOID AND
lv.CODE_DEST = LETTRE_VOIT_TEMP.CODE_DEST AND
lv.CODE_CLIENT = LETTRE_VOIT_TEMP.CODE_CLIENT AND
lv.DATE_CLOTURE = LETTRE_VOIT_TEMP.DATE_CLOTURE AND
lv.DATE_CLOTUR_REEL = LETTRE_VOIT_TEMP.DATE_CLOTUR_REEL
)
这很好,但现在我想添加一个条件:
- 当数据为空时,我不想进行比较
- 当数据为空时,我不想比较
select * from LETTRE_VOIT_TEMP where NOT EXISTS
(
select * from LETTRE_VOIT_FINAL lv
where lv.NOID = LETTRE_VOIT_TEMP.NOID AND
lv.CODE_DEST = LETTRE_VOIT_TEMP.CODE_DEST AND
lv.CODE_CLIENT = LETTRE_VOIT_TEMP.CODE_CLIENT AND
case LETTRE_VOIT_TEMP.DATE_CLOTURE
when is not null then lv.DATE_CLOTURE = LETTRE_VOIT_TEMP.DATE_CLOTURE AND
end
case LETTRE_VOIT_TEMP.DATE_CLOTUR_REEL
when is not null then lv.DATE_CLOTUR_REEL = LETTRE_VOIT_TEMP.DATE_CLOTUR_REEL
end
)
我发现一个语法错误。您的案例陈述不正确。正确的语法是{code>CASE WHEN{condition}然后{result}END
SELECT *
FROM LETTRE_VOIT_TEMP where NOT EXISTS
(
SELECT *
FROM LETTRE_VOIT_FINAL lv
WHERE lv.NOID = LETTRE_VOIT_TEMP.NOID
AND lv.CODE_DEST = LETTRE_VOIT_TEMP.CODE_DEST
AND lv.CODE_CLIENT = LETTRE_VOIT_TEMP.CODE_CLIENT
AND CASE WHEN LETTRE_VOIT_TEMP.DATE_CLOTURE IS NOT NULL THEN lv.DATE_CLOTURE = LETTRE_VOIT_TEMP.DATE_CLOTURE END
AND CASE WHEN LETTRE_VOIT_TEMP.DATE_CLOTUR_REEL IS NOT NULL THEN lv.DATE_CLOTUR_REEL = LETTRE_VOIT_TEMP.DATE_CLOTUR_REEL END
)
您可能需要在
1=1
的情况下添加ELSE语句,以避免另一个语法错误您不能在此格式中测试null
CASE field WHEN IS NULL THEN x
但您可以这样测试它:
CASE WHEN field IS NULL THEN x
应该注意的是,在SQLServer中可以使用以下语法,但不能使用null
CASE field WHEN condition1 THEN x
WHEN condition2 THEN y
ELSE z
END
您在第一个案例陈述的结尾处有一个错位的
和。您为什么需要这个条件?省略子查询中的两个CASE
字段,它将为您提供所需的结果,但您不能简单地比较表达式中的值并期望得到布尔结果,因为Sql Server中没有布尔数据类型。您需要将测试放在另一个案例中,返回1表示真,0表示假。@MahmoudGamal行末尾的和把我搞砸了。我重新格式化了我的答案。这个语法lv.DATE\u CLOTURE=LETTRE\u VOIT\u TEMP.DATE\u CLOTURE导致error@user1958628这也是您原始查询中的一个问题,我的意思是:如果LETTRE_VOIT_TEMP.DATE_CLOTURE不为空,那么lv.DATE_CLOTURE=LETTRE_VOIT_TEMP.DATE_CLOTURE end在我的答案底部,它说您可能需要添加ELSE 1=1