• 关于SQLSQL Server的三值逻辑简析


    在SQL刚入门的时候,我们筛选为某列值为NULL的行,一般会采用如下的方式:
    SELECT * FROM Table AS T WHERE T.Col=NULL  www.2cto.com  
    而实际上此种写法无法得到想要的结果。此时我们在网上找到的解决方法是采用:T.Col IS NULL。虽然此方法能得到数据,但是本人以及部分同行都不知道为什么会出现 T.Col=NULL 无法得到Col为NULL的行的这种结果。
     
      最近我想加强下SQL方面的知识,于是找了 SQLSERVER 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)都把 UNKNOWN当作FALSE处理。使筛选器为UNKNOWN的行会被排除在结果集之外,而CHECK约束中的UNKNOWN值被当作TRUE对待。建设 表中包含一个CHECK约束,要求salary列的值必须大于0,向该表插入salary为NULL时可以被接受,因为(NULL>0)等于 UNKNOWN,在check约束中被视为和TRUE一样。
     
    在筛选器中比较两个NULL值将得到UNKNOWN,它会被当作false处理,就好像其中一个NULL不等于另一个NULL。
      而UNIQUE约束。排序操作和分组操作认为两个NULL值是相等的。
        如果表中有一列定义了UNIQUE约束,将无法向表中插入该列值为NULL的两行。
        GROUP BY 子句把所有NULL值分到一组。  www.2cto.com  
        ORDER BY 子句把所有NULL值排列在一起。
     
      了解UNKNOWN逻辑结果和NULL在不同的语言元素中被处理的方式是有好处的,这样可以避免以后出现麻烦。
     
      一大堆密密麻麻的字,都晕了吧。我用通俗点的解释下。
      用C#语言举例,C#中条件表达式的值是true和false。但是在SQL中还有第三种条件值:unknown。
      在C#中 if(null==null)得到结果是true,不等于的时候是false。
      但是在SQL使用 =、<、>、<>、<=、>= 进行 null值判断的时候,不会得到预期的true或false,而是unknown。
     
      SQL对unknown 的处理主要分为两种:
      1、在 where、on、having子句中,把unknown当着false处理。于是就有了开篇中我的那个疑问了。
      2、在check约束中的unknown值被当作TRUE对待。建设表中包含一个check约束,要求salary列的值必须大于0,向该 表插入salary为null时可以被接受,因为(null>0)等于unknown,在check约束中被视为和true一样。
      根据上面的解释,已经知道了为什么在查询中筛选null的时候需要使用 is null 或者is not null ,常规条件表达式却无法筛选出。
  • 相关阅读:
    呵呵,今天偶然看到了我最早期的商业网站作品
    轻量级的Ajax解决方案——DynAjax:直接在客户端调用C#类的方法
    RegexDesigner.NET 正则表达式开源工具
    Asp.net页面的生命周期之通俗理解
    我设计的公司网站主页 截图
    没想到裴勇俊留了一头长发。
    一个very好的Javascript ajax库,jQuery!
    JQuery资源收集
    收藏:悟透JavaScript
    VS2008 F5不能调试情况一例
  • 原文地址:https://www.cnblogs.com/jimcsharp/p/5601335.html
Copyright © 2020-2023  润新知