我正在使用本机请求从两个表中选择数据 当我在pgAdmin控制台上执行我的请求时,结果返回得很好,但是当我从我的应用程序执行请求时,当我使用round()函数时,为所有列返回相同的值。 在请求下方
SELECT s.id,
p.nom,
p.prenom,
round(s.column1, 2),
round(s.column2, 2),
round(s.column3,2)
FROM table1 s
INNER JOIN table2 p USING (id)
where s.id_type = 2
and s.id_example=7
ORDER BY p.nom, p.prenom
当我执行此请求时,如果round(s.column1, 2)
返回20
作为值,则round(s.column2, 2)
和round(s.column3,2)
的值相同。
我尝试使用别名,但我收到以下异常:
引起:org.postgresql.util.PSQLException:Mauvaise valeur pour le type BigDecimal:NaN
答案 0 :(得分:1)
如果没有显示更多代码,很难分辨......
错误基本上是抱怨NaN
(也就是数字)不是BigDecimal
type的有效值,我理解为Java等同于Postgres' numeric
类型。
Postgres接受NaN
表示浮点数和任意精度类型,但不接受整数类型:
denis=# select 'NaN'::float;
float8
--------
NaN
(1 row)
denis=# select 'NaN'::numeric;
numeric
---------
NaN
(1 row)
denis=# select 'NaN'::bigint;
ERROR: invalid input syntax for integer: "NaN"
LINE 1: select 'NaN'::bigint;
^
因此,它可能表明您的ID列不是整数,您错误地配置了ORM,使得列映射到不正确的等效Java类型,或者您#&# 39;你的表中有一些值(NaN
),Java不支持,而且 - 我猜测...... - 实际上应该是NULL
。
答案 1 :(得分:0)
这里可能存在两个独立问题。
第一个一个很可能是 JDBC问题
org.postgresql.util
表示您正在使用JDBC驱动程序 - 您应该在问题中声明它!
如果您不添加列别名,则所有三个round()
调用都会使用相同的默认列别名round
。当前的JDBC对此并不是很聪明,并且静默地吞下除了第一列以外的所有重复名称。
pgAdmin 允许相同的列名。这就是为什么同样的查询似乎在那里工作。这对于即席查询很有用,但是对于任何严重的事情你必须提供唯一列名。尝试:
SELECT s.id,
p.nom,
p.prenom,
round(s.column1, 2) AS col1,
round(s.column2, 2) AS col2,
round(s.column3, 2) AS col3
FROM table1 s
JOIN table2 p USING (id)
where s.id_type = 2
and s.id_example = 7
ORDER BY p.nom, p.prenom
SQL Fiddle也使用JDBC,这就是下面的演示可以重现问题的原因:
SQL Fiddle demo.
第二个问题是NaN
。请参阅@Denis' answer
此外,请注意,仅为numeric
数据类型定义了具有两个参数的the Postgres round()
function。