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

Tac*_*pex 1 java sqlite comparison equals where

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

除非一个或两个操作数都为NULL,否则IS和IS NOT运算符的工作方式类似于=和!=.在这种情况下,如果两个操作数均为NULL,则IS运算符求值为1(true),IS NOT运算符求值为0(false).如果一个操作数为NULL而另一个操作数不为NULL,则IS运算符的计算结果为0(false),IS NOT运算符为1(true).IS或IS NOT表达式无法计算为NULL.运算符IS和IS的优先级与=不同.


我对SQLite中的关键字"IS"感到困惑.

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

SELECT * FROM table WHERE column = ?
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM table WHERE column IS NULL
Run Code Online (Sandbox Code Playgroud)

我的问题是等号"="或"是"这个词之间存在差异吗?谷歌搜索显示,大多数人使用=进行价值比较,使用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
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 7

上面的答案是错的.他们说'='必须在所有情况下使用,'IS'表示空值.这不是文档所说的.

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

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

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