【问题标题】:SQLite - Difference between IS and = (equals) in WHERE clause. (using JDBC PreparedStatement)SQLite - WHERE 子句中 IS 和 =(等于)之间的区别。 (使用 JDBC PreparedStatement)
【发布时间】:2013-03-05 20:51:18
【问题描述】:

编辑:与 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

谢谢

【问题讨论】:

标签: java sqlite comparison equals where


【解决方案1】:

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

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

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

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

【讨论】:

  • 我希望这是正确的,否则你将如何在准备好的语句中编写 where 子句,其中操作数可能为 NULL 或不为 NULL
【解决方案2】:

在 SQL 中,使用逻辑运算符(例如 =、!=、

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

 x is null checks whether x is a null value.
 x = null is checking whether x equals NULL, which will never be true

【讨论】:

  • 迄今为止最有用的答案。普通运算符不能对 NULL 值进行操作,因此结果为 NULL。 IS NULLIS NOT NULL 有点超出这个世界,所以你可以检查 NULL。 Sqlite 喜欢在语法上更加灵活,这就是为什么 ===IS 都可以匹配非 NULL 值,但这不是标准的。
【解决方案3】:

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

【讨论】:

  • IS 也与 IN 一起使用,例如:WHERE id IS IN (1, 2, 3, 4)
  • @ChrisCooper:哪个 DBMS 支持这个?这在 Oracle、Postgres、DB2、MySQL 和 SQL Server 中肯定是不允许的(而且绝对是非标准的)。
【解决方案4】:

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

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

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

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

希望这会有所帮助!

【讨论】:

    【解决方案5】:

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

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

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

    SELECT Col1
       , Col2
       , isnull(Col3,'') AS Col3
    FROM myTable
    Where col1 = 'somevalue'
    

    【讨论】:

    • 好的。只是为了确保我有这个权利。因此“IS”严格与 NULL 一起使用。因此,即使“column IS value”有效,我也不应该使用它并重组 java 代码以运行两个不同的查询?
    • @TachisAlopex: IS 本身无效。运算符为IS NULLIS NOT NULL(类似于group by 是由两个关键字组成的运算符)
    • @a_horse_with_no_name:对不起,如果我没有意义。我的意思是:SELECT * FROM projects WHERE id IS 1 返回 id = 1 的记录,但使用的是 IS 关键字。它起作用了,但如果这不是我想做的,我必须创建多个 sql 语句
    • @TachisAlopex: where id is 1 是无效的 SQL(至少在 Oracle、Postgres、SQL Server 和 DB2 中)。您使用的是哪个 DBMS?
    • @a_horse_with_no_name 真的吗?这可能是它有效的原因。我正在使用 SQLite。我刚发现这个:stackoverflow.com/a/9102445/1470058。我现在要编辑我原来的问题。
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多