我使用PostgreSQL,我想用这个查询提取最大值:
select max (num_ordre_decision) from decision
问题是num_ordre_decision
包含这种数据:
'4/35/677'
'4/35/1001'
我的列类型是字符串。当我运行此查询时,我有最大值:
'4/35/1001'
false 。
我只想将677
与1001
进行比较,以便在前一种情况下获得最大值'4/35/677'
。
我认为我应该在查询中使用拆分。
我尝试了这个查询:
select max(split_part(num_ordre_decision, '/', 3))
from decision;
我有这个值:'99'
当我尝试运行此查询时
select split_part(num_ordre_decision, '/', 3)
from decision;
我得到了这个结果
''
''
'677'
'1001'
'99'
出现此结果''
,因为表中的实际值不包含分隔符'/'
。我认为max(split_part(num_ordre_decision, '/', 3)
使其成为9+9
的总和。但正确的结果应该是1001
因此必须将它们作为数字进行比较。
已更新:
我想在我的项目中使用此查询
我有这个功能:
public List getMaxNumOrder (){
String query= "select max(NULLIF(split_part(num_ordre_decision, '/', 3), '')::int) from decision";
SQLQuery sqlQuery = this.getSession().createSQLQuery(query);
return sqlQuery.list();
}
但是当我遇到这个错误时:
org.hibernate.QueryException: Not all named parameters have been set: [:int] [select max(NULLIF(split_part(num_ordre_decision, '/', 3), '')::int) from decision]
at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:339)
at org.hibernate.impl.SQLQueryImpl.verifyParameters(SQLQueryImpl.java:228)
我认为我应该使用: query.setParameter
我不知道如何使用它
答案 0 :(得分:1)
您可以将最大值视为:
select max(split_part(num_ordre_decision, '/', 3))
from decision;
要获得总体最大值,您可能需要:
select num_ordre_decision
from decision
order by split_part(num_ordre_decision, '/', 3) desc
limit 1;
答案 1 :(得分:1)
继续@戈登的出色工作。如果要按整数对最后一个部分进行排序,则需要按原样转换值。
这也会处理你的空字符串。
select
max(NULLIF(split_part(num_ordre_decision, '/', 3), '')::int)
from decision;
答案 2 :(得分:0)
作为替代方法(当您需要所有列的最大值时):
从(选择)中选择max(some_val) UNNEST(string_to_array(num_ordre_decision,' /')):: int as some_val 来自决定)x;