SQLite - WHERE子句中IS和=(等于)之间的差异。 (使用JDBC PreparedStatement)

时间:2013-03-05 20:51:19

标签: java sqlite comparison equals where

编辑:与a_horse_with_no_name交谈我发现SQL中的“IS”略有不同,允许使用“IS”:stackoverflow.com/a/9102445/1470058在NULL 值之间进行比较。这给我带来了很多困惑。感谢:

  

IS和IS NOT运算符的工作方式与=和!=相同,除非是一个或两个   操作数为NULL。在这种情况下,如果两个操作数均为NULL,   那么IS运算符的计算结果为1(真)和IS NOT运算符   评估为0(假)。如果一个操作数为NULL而另一个不是,   那么IS运算符的计算结果为0(false),IS NOT运算符为   1(真)。 IS或IS NOT表达式不可能   评估为NULL。运算符IS和IS的优先级与=。

不同

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

我正在开展一个项目,要求我使用Java准备好的语句。我遇到过两种类型的WHERE子句:

SELECT * FROM table WHERE column = ?

SELECT * FROM table WHERE column IS NULL

我的问题是等号“=”或“是”这个词之间存在差异吗?谷歌搜索显示,大多数人使用=进行价值比较,使用IS进行比较。但是我尝试了一些我自己的SQLite查询。

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

我的问题是我可以在两种情况下使用“IS”而不会出现意外结果吗?我想为一个查询做一个准备好的语句,该查询对列的约束可能是也可能不为null。我希望我有意义。

为了简化我所说的一切,我可以使用以下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

谢谢

6 个答案:

答案 0 :(得分:6)

上述答案是错误的。他们说'' ='必须在所有情况下使用,并且' IS'对于空值。这不是文档所说的。

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

通过运算符的设计,NULL = NULL将为false,NULL为NULL将为真。

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

答案 1 :(得分:1)

在SQL语言中“IS”仅在与NULL(IS NULL或IS NOT NULL)进行比较时使用,因为x = NULL将始终失败(NULL不等于任何内容)

答案 2 :(得分:1)

" IS" keyword必须与NULL值一起使用。 (例如,IS NULL或IS NOT NULL)。

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

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

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

答案 3 :(得分:1)

我不确定您是否可以使用“Is”而不是“=”除了null,但我可以说您无法使用“=”符号将列与null进行比较。你应该使用“Is null”或“Is not null”。原因是在SQL中,一个null不等于另一个null。这意味着如果你写了类似null = null的东西,它将返回false。因此,假设您的列不包含任何在数据库中意味着它的列,并且您尝试使用“=”将此null与另一个null进行比较,这将永远无法重新生成。

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

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

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

希望这会有所帮助!!

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在SQL中,使用逻辑运算符(例如=,!=,<等等)将null值与任何其他值(包括另一个null)进行比较将导致null,这被视为false where子句的目的。原因是null表示“未知”,因此与null进行任何比较的结果也是“未知”。所以你不会使用my_column = null来获取行。

SQL提供了一种特殊的语法,用于测试列是否为null,via为null且不为null,这是测试null(或非null)的特殊条件。

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