【问题标题】:Postgresql : syntax error at and near nullPostgresql:在null处和附近出现语法错误
【发布时间】:2020-02-05 18:10:00
【问题描述】:

我有一个连接到 postgresql 的 Web 应用程序。我正在尝试使用准备好的语句从数据库中获取数据,并在 null 或附近不断出现语法错误。

以下是我的查询代码sn-p:

PreparedStatement pstmt = conn.prepareStatement("SELECT * "+ "FROM rooms1 o " + "JOIN rooms2 op" +
                                                 " ON o.room_id = op.room_id " +"JOIN rooms3 p " +
                                                 " ON op.person_id = p.person_id " +
                                                 "WHERE o.room_id = ? " +
                                                 " ORDER BY o.plate_order ASC;")) {
  //Rest of code

这个查询在检查测试数据库时工作正常,但是当在准备好的语句中使用它时,它会给出错误

Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "null"
position: 54

根据一些研究,我认为问题出在我的查询上,这也是我第一次编写 Postgresql 查询。请看一下。

【问题讨论】:

  • 您确定所有参数都设置为合理值吗?
  • 重述 Thorbjørn Ravn Andersen 提出的问题,只是为了澄清 - 您是否在执行前为准备好的语句设置了参数值(例如' pstmt.setString(1,"RM123"); ' ) ?你可能会发送一个空值吗?
  • 是的,我很确定。
  • 您应该能够通过搜索文本日志将实际查询发送到服务器。此错误表明查询结构错误,而不是发送到准备好的语句的值(我相信一旦准备好语句就不可能导致此错误)。您应该能够在SELECT string_agg(setting, '/' ORDER BY name) FROM pg_catalog.pg_settings WHERE name IN('data_directory', 'log_filename', 'log_directory');设置的位置找到日志
  • 您可能没有执行您认为的查询。在 PostgreSQL 服务器的日志文件中查找有错误的查询,而不会妨碍客户端库的混淆。

标签: java postgresql jdbc prepared-statement


【解决方案1】:

o.room_id = ?如果 ?为空,因此您必须检查“o.room_id 为空”。你可以用 inline if 来检查这个

【讨论】:

  • 不太可能解决这个问题,因为使用= 运算符比较列与NULL 值虽然没有意义,但不会导致错误消息。
【解决方案2】:

我已经用***指出了错误位置54:

SELECT * FROM rooms1 o
JOIN rooms2 op ON o.room_id = ***op.room_id
JOIN rooms3 p  ON op.person_id = p.person_id
WHERE o.room_id = ?
ORDER BY o.plate_order ASC

我不完全理解错误信息,但是 op.room_id 可能出现空值。

奇怪的错误恕我直言,但请尝试左连接

SELECT o.*, op.*, p.* FROM rooms1 o
LEFT JOIN rooms2 op ON o.room_id = op.room_id
LEFT JOIN rooms3 p  ON op.person_id = p.person_id
WHERE o.room_id = ?
ORDER BY o.plate_order ASC

(末尾的分号;是多余的。)

【讨论】:

  • 如果 JOIN 列中的一个包含 NULL 值,则不会导致错误;它根本不会加入这些行,所以 LEFT JOIN 不会解决它。
  • @ŁukaszKamiński 确实,我已经想知道 SELECT * 是否扩展到实际列,以便位置 54 指向某个空值。不幸的是,没有太多使用 Postgresql 的经验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2021-12-24
  • 2013-09-10
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多