Java 条件为空时发生JDBC错误
我正在使用Scala中的JDBC和ScalikeJDBC库 让我们做一个简单的查询:Java 条件为空时发生JDBC错误,java,sql,postgresql,scala,jdbc,Java,Sql,Postgresql,Scala,Jdbc,我正在使用Scala中的JDBC和ScalikeJDBC库 让我们做一个简单的查询:UPDATE“test\u table”SET“test”=1234,其中(“asdad”为null) 如果我直接将这个查询传递给psql,或者通过JDBC原始执行它,一切都会正常工作。但是如果我尝试将null作为参数传递,我会得到以下错误:org.postgresql.util.psqleexception:error:syntax error在“$1”处或附近 我通过如下方式传递null值: session.
UPDATE“test\u table”SET“test”=1234,其中(“asdad”为null)
如果我直接将这个查询传递给psql
,或者通过JDBC原始执行它,一切都会正常工作。但是如果我尝试将null
作为参数传递,我会得到以下错误:org.postgresql.util.psqleexception:error:syntax error在“$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)
谢谢 在
之后不允许使用参数。您必须将为空
或不为空
写入固定表达式
允许的是=$1
,然后将此占位符设置为null
,但这不会导致与null
的比较总是未知
见相关问题:
在之后不允许使用参数。您必须将为空
或不为空
写入固定表达式
允许的是=$1
,然后将此占位符设置为null
,但这不会导致与null
的比较总是未知
见相关问题:
给出了一个完美的解释——除了他的参考资料是针对SQL Server的(这恰好是一致的,在这种情况下,两者都使用标准SQL)
您仍然可以使用标准运算符参数化单个查询:
session.update("""UPDATE test_table
SET test = 1234
WHERE asdad = ?
OR (asdad IS NULL) = ?
)""", null, true);
对于任何其他价值:
... , 123, false);
确保观察是否添加了更多的WHERE
条件
更好的方法是使用以下方法:
session.update("""UPDATE test_table
SET test = 1234
WHERE asdad IS NOT DISTINCT FROM ?
)""", null);
适用于NULL
以及任何其他值。给出了一个完美的解释-除了他的参考是针对SQL Server的(这恰好是一致的,在这种情况下,两者都使用标准SQL)
您仍然可以使用标准运算符参数化单个查询:
session.update("""UPDATE test_table
SET test = 1234
WHERE asdad = ?
OR (asdad IS NULL) = ?
)""", null, true);
对于任何其他价值:
... , 123, false);
确保观察是否添加了更多的WHERE
条件
更好的方法是使用以下方法:
session.update("""UPDATE test_table
SET test = 1234
WHERE asdad IS NOT DISTINCT FROM ?
)""", null);
适用于NULL
以及任何其他值。谢谢。从用户端传递“isnull”的首选方式是什么?我能想象的最简单的方法就是简单的字符串插值,但这似乎不是最好的方法。是的,字符串。它是查询表达式的一部分,因此,如果您想根据某个条件在“IS NULL”和“IS NOT NULL”之间切换,这可能是最好的方法。使用条件构建准备好的语句。如果要在NULL
上进行测试,请使用IS NULL
,在其他情况下,请使用IS NOT NULL
编写准备好的语句。谢谢,这很有意义。幸运的是,我可以使用查询生成器,只需在.where(“foo为NULL”)
和.where(“foo不为NULL”)
(伪代码)之间切换即可。谢谢。从用户端传递“isnull”的首选方式是什么?我能想象的最简单的方法就是简单的字符串插值,但这似乎不是最好的方法。是的,字符串。它是查询表达式的一部分,因此,如果您想根据某个条件在“IS NULL”和“IS NOT NULL”之间切换,这可能是最好的方法。使用条件构建准备好的语句。如果要在NULL
上进行测试,请使用IS NULL
,在其他情况下,请使用IS NOT NULL
编写准备好的语句。谢谢,这很有意义。幸运的是,我可以使用查询生成器,只需在.where(“foo为NULL”)
和.where(“foo非NULL”)
(伪代码)之间切换即可。这是一个有趣的见解,感谢您的提示!实际上,我需要支持不同的数据库后端,例如MySQL、Postgres和SQL Server。实际上,这两种解决方案都是标准的SQL:。遗憾的是,并不是所有的RDBMS都像Postgres那样雄心勃勃地实现标准功能……这是一个有趣的见解,谢谢你的提示!实际上,我需要支持不同的数据库后端,例如MySQL、Postgres和SQL Server。实际上,这两种解决方案都是标准的SQL:。遗憾的是,并不是所有的RDBMS都像Postgres那样雄心勃勃地实现标准功能。。。