如何按顺序在if语句中使用列相对位置?

时间:2017-02-25 02:48:47

标签: mysql sql sql-order-by

我在MySQL中运行如下的SQL查询:

select * 
from (
    select 2 as o,1 as t from dual 
    union 
    select 1 as o,2 as t from dual 
    ) x
order by if((select 1),o,t);

效果很好,但是当我在if语句中使用列相对位置时,它不起作用。

如何在if声明的ORDER BY中使用列相对位置?

select * 
from (
    select 2 as o,1 as t from dual 
    union 
    select 1 as o,2 as t from dual 
    ) x
order by if((select 0),1,2);

2 个答案:

答案 0 :(得分:1)

我不确定你真正的困惑是什么。当整数出现在order by中时,则将其视为列号。对整数的任何其他使用都被解释为表达式。

已从SQL标准中删除列号的使用。因此,在将来的版本中无法保证在任何特定数据库中使用它。最好使用列名。

答案 1 :(得分:0)

我认为您希望根据两列标准对查询进行排序,如果我是正确的,您可以使用以下内容:

@Transient
public StatusInfo getLatestStatusInfo() {
  if ( statusInfos.isEmpty() ) {
    return null;
  }
  else if ( statusInfos.size() == 1 ) {
    return statusInfos.get( 0 );
  }
  else {
    // you could add logic here to do the sort in-memory 
    // for cases where you may have the full collection
    // but still want to obtain the last entry ...
  }
}

注意:如果您不想删除重复值作为性能问题,请使用... order by case when (your criteria) then column1 else column2 end; 代替union all