2

编辑:与 a_horse_with_no_name 交谈我发现 SQLite 中的“IS”有点不同,允许使用“IS”比较 NULL值:stackoverflow.com/a/9102445/1470058。这为我消除了很多困惑。谢谢:

IS 和 IS NOT 运算符的工作方式与 = 和 != 类似,除非其中一个或两个操作数为 NULL。在这种情况下,如果两个操作数都为 NULL,则 IS 运算符的计算结果为 1(真),而 IS NOT 运算符的计算结果为 0(假)。如果一个操作数为 NULL 而另一个不是,则 IS 运算符的计算结果为 0(假)并且 IS NOT 运算符为 1(真)。IS 或 IS NOT 表达式不可能计算为 NULL。运算符 IS 和 IS NOT 与 = 具有相同的优先级。


我对 SQLite 中的关键字“IS”感到困惑。

我正在做一个需要我使用 Java 准备好的语句的项目。我遇到了两种类型的 WHERE 子句:

SELECT * FROM table WHERE column = ?

SELECT * FROM table WHERE column IS NULL

我的问题是等号“=”或“IS”这个词之间有什么区别吗?Google 搜索显示,大多数人使用 = 进行值比较,使用 IS 与 null 进行比较。但是我尝试了一些我自己的 SQLite 查询。

  • “IS”将按预期返回“ column IS NULL ”和“ column IS value ”的结果。
  • “=”将按预期返回“ column = value ”的结果,但不会返回“ column = NULL ”的结果。

我的问题是我可以在这两种情况下都使用“IS”而不会产生意外结果吗?我想为单个查询制作一个准备好的语句,该查询对列的约束可能为空,也可能不为空。我希望我是有道理的。

为了简化我所说的一切,我是否可以使用以下 Java 代码而不会因使用“IS”而产生意外影响:

private static final String queryProjectSql = "SELECT * FROM fields WHERE project IS ?";
// later in a method
sqlStatement = connection.prepareStatement(queryProjectSql);
sqlStatement.setString(1, project); //Project may be a String or null

谢谢你

4

6 回答 6

16

上面的答案是错误的。他们说在所有情况下都必须使用“=”,而空值必须使用“IS”。这不是文档所说的。

文档说这两个运算符是等效的,唯一的区别在于它们如何评估 null。= 两边的 NULL 将评估为 false。IS 将评估 NULL 条件的真实性。

这个 NULL = NULL 将由操作员的设计为假,而 NULL is NULL 将是真的。

在某些情况下,您可能不关心列是否具有空值或合法的与您的查询不匹配。在这种情况下,您将使用 = ... 并且在某些情况下您确实关心 null 在这种情况下您将使用 'is' 。

于 2016-07-05T02:52:49.583 回答
1

在 SQL 中,使用逻辑运算符(例如 =、!=、< 等)将空值与任何其他值(包括另一个空值)a 进行比较将导致空值,出于 a 的目的,这被视为假where 子句。原因是 null 表示“未知”,因此与 null 进行任何比较的结果也是“未知”。因此,使用 my_column = null 不会对行产生任何影响。

SQL 提供了特殊的语法来测试列是否为空,通过是否为空和不为空,这是测试空(或非空)的特殊条件。

 x is null checks whether x is a null value.
 x = null is checking whether x equals NULL, which will never be true
于 2013-03-05T20:53:18.283 回答
1

在 SQL 语言中,“IS”仅在与 NULL(IS NULL 或 IS NOT NULL)比较时使用,因为 x = NULL 总是会失败(NULL 不等于任何东西)

于 2013-03-05T20:53:39.800 回答
1

我不确定您是否可以使用“Is”而不是“=”,但 null 除外,但我可以说您不能使用“=”符号将列与 null 进行比较。您应该使用“Is null”或“Is not null”。原因是在 SQL 中,一个 null 不等于另一个 null。这意味着如果您编写类似 null = null 的内容,它将返回 false。因此,请考虑这样一种情况,您的列不包含任何在数据库中意味着它为空的内容,并且您尝试使用“=”将此空值与另一个空值进行比较,这将永远不会让您恢复真实。

请参阅 Codd 规则 3:空值的系统处理。它说一个空值不等于关系数据库中的另一个空值。

我从 wiki 分享这个:http://en.wikipedia.org/wiki/Null_(SQL)

对于不是数据库专家的人来说,记住 null 意味着什么的一个好方法是记住,就信息而言,“缺少值”与“零值”不同。同样,“缺乏答案”与“否定答案”不同。例如,考虑“胡安拥有多少本书?”这个问题。答案可能是“零”(我们知道他没有拥有)或“空”(我们不知道他拥有多少,或者不拥有)。在数据库表中,报告此答案的字段将以 null 值开始,并且在我们确定 Juan 没有书籍之前,它不会被更新为“零”。同样,当问题是“胡安妮塔有车吗?”时,答案“我们不知道”与“

希望这会有所帮助!

于 2013-03-05T21:39:43.730 回答
0

如果列值为null,则=运算符在与null比较时永远不会返回true,因此NULL!= NULL,因此需要使用IS NULL进行测试。

于 2013-03-05T20:53:14.423 回答
0

“IS”关键字严格与 NULL 值一起使用。(例如,IS NULL 或 IS NOT NULL)。

如果您正在寻找匹配项,则需要使用 =。

如果您担心处理空列值,那么您应该使用 isnull() 函数包装关注的列。

SELECT Col1
   , Col2
   , isnull(Col3,'') AS Col3
FROM myTable
Where col1 = 'somevalue'
于 2013-03-05T20:56:04.360 回答