楼主你看一下引用的文字,你存在这个疑问主要是你对逻辑需求转换为sql代码,有点问题,你上面不是说了吗:排除所有spid为0或为null的记录,并且排除所有cpid为0或为null的记录,当然是(spid is not null and spid <> 0)  
  and (cpid is not null and cpid <> 0) 怎么可能会是 (spid is not null or spid <> 0)
  and (cpid is not null or cpid <> 0) 这个呢,这两个根本就是不同的逻辑关系,楼主有点钻牛角啦

解决方案 »

  1.   

    你直接ISNULL(spid,'0')不是很好?
      

  2.   

    之所以第3个语句是错误的是因为你的需求。你是要:spid为0或为null的记录,并且排除所有cpid为0或为null的记录,那么spid就既不是0,也不是null,同时cpid也是一样的。而第3个语句,你写成了:(spid is not null or spid <> 0)  --排除所有spid为0或为null的
      and (cpid is not null or cpid <> 0)  --排除所有cpid为0或为null的这就有问题了,比如spid是0,cpid是0,那么这个语句就错误了,为什么呢?因为当spid和cpid都为0时,sql server 判断(spid is not null or spid <> 0)条件的时候,发现spid为0,那么就不是null,也就是满足spid is not null条件,于是条件成立,换句话说,他不会继续往后看or后面的条件了,也就是不会再看条件spid <> 0是否会满足。所以对于or来说,只要第一个条件,也就是or之前的条件满足的时候,那么就不会看or后面的条件是否满足,所以导致了这个语句的错误。而and是都会看,and前,and后,的条件都必须要满足的。
      

  3.   

    and和or的分别大学没学过吗?
      

  4.   

    完全不知道你对and和or的理解,好象和我理解的完全相反