SQLSERVER 三值逻辑
三值逻辑?(3VL,Three-valued Logic)? 在SQL中逻辑表达式的可能值包括TRUE、FALSE、UNKNOWN。他们被称为三值逻辑。三值逻辑是SQL所特有的。大多数语言的逻辑表达式只有TRUE或FALSE两种值。 以下内容出自CSDN?http://topic.csdn.net/u/20100826/18/7b81012a-b5c4-48b1-b5d1-40a92f3e0388.html? - 外联接通常会引入NULL,即使所有表的字段都定义为NOT NULL。 ? 首先,如果可能,尽量让所有字段都声明为NOT NULL。除非是更适合使用NULL的场合(从业务出发)。其次,在使用NULL时,一定要搞清楚三值逻辑和数据库引擎对NULL的处理: (SQLServer有一个选项SET ANSI_DEFAULTS,默认为ON,即与SQL标准一致。设为OFF的效果详见联机丛书。) 1. NULL与别的值进行+-*/等计算操作(包括在大多数函数中使用NULL)后,结果是NULL(标量表达式)。NULL与别的值进行=、>、<等比较操作后,结果是Unknown(断言)。 NOT Unknown --> Unknown Unknown AND/OR Unknown --> Unknown Unknown OR TRUE --> TRUE Unknown AND TRUE --> Unknown Unknown OR FALSE --> Unknown Unknown AND FALSE --> FALSE具体可查三值逻辑的真值表。 2. 在where/on/having和if/case when中,只有True才使条件成立(即Unknown当作False来处理)。比如: where column = value:表中column为NULL的行永远不会返回,即使value是NULL; case value when NULL then XXX when ... end:XXX永远不会执行,即使value是NULL; if <Unknown> XXX else YYY end或case when <Unknown> then XXX else YYY end:这两种情况下,YYY会执行。 3. 包含外键约束和Check约束的字段允许NULL(即约束只当条件为False时出错,Unknown是不管的)。 4. 包含唯一约束(unique index)的字段只允许一个NULL的行,再插入或更新该字段为NULL的行会报字段重复的错误。 5. GROUP BY时,所有NULL被视为一组。 6. ORDER BY时,所有NULL排在一起,但NULL排在非空值的前面(如SQL Server)还是后面(如Oracle),SQL标准未规定。 7. 聚集函数(SUM/AVG/MAX/MIN/COUNT)忽略NULL的行。 8. declare的变量,在未赋值之前为NULL。 9. 与NULL处理相关的运算符和函数: - IS NULL/IS NOT NULL:用这两个运算符来判断一个值是否为NULL,而不是=或<>。 - ISNULL/COALESCE:取第一个非空值(注意两个函数的数据类型转换规则不同)。 - NULLIF(a,b):等价于CASE WHEN a = b THEN NULL ELSE a END。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |