SQL NOT运算符无法正常工作

时间:2017-05-24 19:42:55

标签: sql sql-server

我有一个SQL查询,它执行以下操作:

<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script> 

var data = {
           "1": {
               "average percent match": 0.2916666667,
               "match counts": 1.0,
               "confidence": 0.25
           },
           "0": {
               "average percent match": 0.25,
               "match counts": 1.0,
               "confidence": 0.25
           },
       }
       var total =0;
       $.each(data, function (i, item) {
           total += item["match counts"];
       });
       alert("Total of match counts is: " + total);

两列TEST1和TEST2应该是对立的,但TEST2始终为false。知道为什么吗?

2 个答案:

答案 0 :(得分:0)

唯一想到的是:

col1   col2   col3
'D'    'E'    

此处col1 = 'A' OR col2 = 'B' OR col3 = 'C'会产生unknown,因为NULL = 'C'既不会评估为true也不会评估为false。表达式不正确,因此第一个IIF会产生'false'

NOT (col1 = 'A' OR col2 = 'B' OR col3 = 'C')也是unknown,因为unknown的反面既不是真也不是假。表达式不正确,因此第二个IIF也会产生'false'

这可能是您所看到的结果的原因吗?

答案 1 :(得分:0)

Gordon Linoff指出,如果某些值为null,您的代码将无法正常工作,除此之外,您应该看到预期的结果。

请注意null = 'A'null,而不是false。 ergo not(null = 'A')也是null

create table t (col1 char(1), col2 char(1), col3 char(1));
insert into t values
 ('A','A','A')
,('A','B','C')
,('A','B',null)
,(null,null,null)
,('Z','Z',null)
,('Z','Z','Z');

select *,
    iif (   (col1 = 'A' or col2 = 'B' or col3 = 'C'), 'true', 'false') as test1,
    iif (not(col1 = 'A' or col2 = 'B' or col3 = 'C'), 'true', 'false') as test2
from t;

rextester演示:http://rextester.com/CRYH34782

返回:

+------+------+------+-------+-------+
| col1 | col2 | col3 | test1 | test2 |
+------+------+------+-------+-------+
| A    | A    | A    | true  | false |
| A    | B    | C    | true  | false |
| A    | B    | NULL | true  | false |
| NULL | NULL | NULL | false | false |
| Z    | Z    | NULL | false | false |
| Z    | Z    | Z    | false | true  |
+------+------+------+-------+-------+

您可以将专栏封装在isnull()coalesces()中,以便为null提供替换值。