AND b.Id is (case when 1 then  b.Id  when 2 then not null when 3 then null end) select 
 case when 1 and b.id = b.id then column
      when 2 and b.id is not null then column
      when 3 and b.id is null then column
 end
from XXXcase when 貌似不能写ADN里吧

解决方案 »

  1.   

    null不等于任何东西..所以要使用is null或is not null可以设置ANSI_NULLS选项.
      

  2.   

    select * from where b is null与 
    select * from where b = null 结果不一样,第二个b=null 为假,因为null不等于任何东西,所以是没有结果的,
    例如:
    张三 男 20
    n 21
    NULL 男 21
    那么第一个是有结果的,而第二个是没有结果的AND b.Id is (case when 1 then  b.Id  when 2 then not null when 3 then null end) 写法有点问题吧,case后面缺少变量,并且后面的语法也 not null与null都有问题
      

  3.   


    这是SQL特有的Tree-Valued-Logic.以下摘自<摘自SQL Server 2005技术内幕:T-SQL查询>在SQL 中逻辑表达式的可能值包括TRUE、FALSE和UNKNOWN。它们被称为三值逻辑。三值逻辑是SQL所特有的。大多数编程语言的逻辑表达式只有 TRUE或FALSE两种。SQL中的UNKNOWN逻辑值通常出现在包含NULL值得逻辑表达式中(例如,下面三个表达式的逻辑值都是 UNKNOWN:NULL>42;NULL=NULL;X+NULL>Y)。NULL值通常表示丢失或不相关的值。当比较丢失值和另一个值(这个值也可能是NULL)事,逻辑结果总是UNKNOWN。
           处理UNKNOWN逻辑结果和NULL时非常容易混淆。NOT TRUE等于FALSE,NOT FALSE等于TRUE,而否定的UNKNOWN(NOT UNKNOWN)还是UNKNOWN。
           UNKNOWN逻辑结果和NULL在不同的语言元素中被区别对待。例如,所有的查询筛选器(ON、WHERE和HAVING)都把UNKNOW当作 FALSE处理。使筛选器为UNKNOWN的行会被排除在结果集之外。而CHECK约束中的UNKNOWN值被当作TRUE对待。假设表中包含一个 CHECK约束,要求salary列的值必须大于0。向该表插入salary为NULL的行时可以被接受,因为(NULL>0)等于 UNKNOWN,在CHEKC约束总被视为和TRUE一样。
           在筛选器中比较两个NULL值将得到UNKNOWN,它会被当作FALSE处理,就好像其中一个NULL不等于另外一个NULL。
           而UNIQUE约束、排序操作和分组操作认为两个NULL值是相等的。    *    如果表中有一列定义了UNIQUE约束,将无法向表中插入该列为NULL的两行
        *    GROUP BY 子句把所有NULL值分到一组
        *    ORDER BY 子句把所有NULL值排列在一起       总之,了解UNKNOWN逻辑结果和NULL在不同语言元素中被处理的方式是有好处的,这样可以避免以后出现麻烦。