带IF或case的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 =

我正在使用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 = 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