IS NULL条件下的JDBC错误

时间:2014-07-24 12:52:45

标签: java sql postgresql scala jdbc

我使用ScalaikeJDBC库从Scala使用JDBC。

我们来一个简单的查询:UPDATE "test_table" SET "test" = 1234 WHERE ("asdad" is null)

如果我将此查询直接传递给psql或通过JDBC执行它,一切正常。但是,如果我尝试将null作为参数传递,则会收到以下错误:org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"

我传递null这样的值:

session.update("""UPDATE "test_table" SET "test" = 1234 WHERE ("asdad" is ?)""", null)

?占位符由ScalikeJDBC库自动转换为$1。执行的查询显示在Scala控制台中:

   UPDATE "test_table" SET "test" = 1234 WHERE ("asdad" is null)  

谢谢!

2 个答案:

答案 0 :(得分:3)

is后不允许使用参数。您必须将IS NULLIS NOT NULL写为固定表达式。

允许的内容为= $1,然后将此占位符设置为null,但这不会导致您期望与NULL进行比较时始终unknown

参见相关问题:

Why does NULL = NULL evaluate to false in SQL server

Is there any difference between IS NULL and =NULL

答案 1 :(得分:2)

@Janick提供了完美的解释 - 除了他的引用是针对SQL Server(恰好同意,都在这个情况下使用标准SQL)。 Read the Postgres manual here.

您仍然可以使用标准运算符参数化 查询:

session.update("""UPDATE test_table
                  SET    test = 1234
                  WHERE  asdad = ?
                  OR    (asdad IS NULL) = ?
              )""", null, true);

对于任何其他价值:

              ... , 123, false);

如果添加更多WHERE条件,请务必观察operator precedence

IS NOT DISTINCT FROM

更好的是,使用它:

session.update("""UPDATE test_table
                  SET    test = 1234
                  WHERE  asdad IS NOT DISTINCT FROM ?
              )""", null);

适用于NULL以及任何其他值。