我使用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)
谢谢!
答案 0 :(得分:3)
is
后不允许使用参数。您必须将IS NULL
或IS NOT NULL
写为固定表达式。
允许的内容为= $1
,然后将此占位符设置为null
,但这不会导致您期望与NULL
进行比较时始终unknown
参见相关问题:
答案 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
以及任何其他值。