在SQL查询中,equals何时或为什么不是notequals的对立面?
在包含五条记录的表中,浇头值为“巧克力”,其中两条在MaraschinoCherry列中的值为“是”,其他三条在该列中不包含任何内容(不是“否”-无/空白) 此查询工作正常:在SQL查询中,equals何时或为什么不是notequals的对立面?,sql,oracle,toad,Sql,Oracle,Toad,在包含五条记录的表中,浇头值为“巧克力”,其中两条在MaraschinoCherry列中的值为“是”,其他三条在该列中不包含任何内容(不是“否”-无/空白) 此查询工作正常: select definition from desserts where (Toppings = 'Chocolate') and (MaraschinoCherry <> 'Yes') order by id 你的问题的答案很简单。与NULL值的任何比较(有两个例外)都会产生NULL作为
select definition from desserts
where (Toppings = 'Chocolate') and
(MaraschinoCherry <> 'Yes')
order by id
你的问题的答案很简单。与NULL值的任何比较(有两个例外)都会产生NULL作为结果。所以
MaraschinoCherry = 'Yes'
及
(函数ISNULL()有点等效,但COALESCE允许更多参数,并且是标准SQL。)
还有其他方法可以解决此问题,例如在定义表时为列指定默认值,将显式比较添加到NULL,将列声明为“NOT NULL”,或者在某些数据库中,通过在比较中重写NULL的行为来违反SQL标准(强烈不建议!)你的问题答案很简单。与NULL值的任何比较(有两个例外)都会产生NULL作为结果。所以
MaraschinoCherry = 'Yes'
及
(函数ISNULL()有点等效,但COALESCE允许更多参数,并且是标准SQL。)
还有其他方法可以解决此问题,例如在定义表时为列指定默认值,将显式比较添加到NULL,将列声明为“NOT NULL”,或者在某些数据库中,通过在比较中重写NULL的行为来违反SQL标准(强烈不建议!).再次检查值为“是”的记录。也许它周围有一些空间?尝试使用
运行相同的查询,如“%Yes%”
以确保相同。您确定这两个查询都是“Yes”而不是“Yes”或更糟吗?尝试修剪。MaraschinoCherry的数据类型是什么?如果仅为是/否,则应将其设置为布尔值,并改为存储TRUE或FALSE。提供create table和insert语句以填充该表。空列将被解释为NULL。这可能会对正在发生的事情产生影响。请仔细检查值为“是”的记录。也许它周围有一些空间?尝试使用运行相同的查询,如“%Yes%”
以确保相同。您确定这两个查询都是“Yes”而不是“Yes”或更糟吗?尝试修剪。MaraschinoCherry的数据类型是什么?如果仅为是/否,则应将其设置为布尔值,并改为存储TRUE或FALSE。提供create table和insert语句以填充该表。空列将被解释为NULL。这可能会对正在发生的事情产生影响。我错过了一些东西。。。如果MaraschinoCherry
为'Yes'
或null
,则第一个查询未找到任何内容-由于您描述的null比较行为,null'Yes'
为false-第二个查询查找两条记录。你怎么从第一个到第三个,从第二个到一个都没有?我错过了一些东西。。。如果MaraschinoCherry
为'Yes'
或null
,则第一个查询未找到任何内容-由于您描述的null比较行为,null'Yes'
为false-第二个查询查找两条记录。你是如何从第一个到第三个,从第二个到一个都没有的?
MaraschinoCherry <> 'Yes'
COALESCE(MaraschinoCherry, 'NO') = 'Yes'