楼主你看一下引用的文字,你存在这个疑问主要是你对逻辑需求转换为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) 这个呢,这两个根本就是不同的逻辑关系,楼主有点钻牛角啦
and (cpid is not null and cpid <> 0) 怎么可能会是 (spid is not null or spid <> 0)
and (cpid is not null or cpid <> 0) 这个呢,这两个根本就是不同的逻辑关系,楼主有点钻牛角啦
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后,的条件都必须要满足的。