Select子句为不同的列返回相同的值

时间:2014-04-15 09:47:06

标签: postgresql jdbc alias rounding nan

我正在使用本机请求从两个表中选择数据 当我在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

2 个答案:

答案 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