MySQL Order By多列,以Case End排序为字符串

时间:2019-04-27 13:46:24

标签: mysql

想按以下顺序进行选择。

app.post('/send/sendPlanilha', function(req, res, next){}

逻辑是如果t1.a为空,则按

... ...
order by
    case when t1.a is not null 
         then t1.a 
         else concat(t2.b, ',', t2.c)
    end asc;

t1.a,t2.b,t2.c均为INT或BIGINT。问题是,t1.a被当作String排序,结果就像

t2.b asc, t2.c asc

代替

10
100
1000
...
11
...

主要是因为concat(...)返回一个String。如何解决该问题。

2 个答案:

答案 0 :(得分:2)

您的逻辑与此等效:

order by
  case 
    when t1.a is not null 
      then t1.a 
      else t2.b
    end, 
  t2.b, 
  t2.c

或简单地:

order by
  coalesce(t1.a, t2.b), 
  t2.b, 
  t2.c

或者这个:

order by
  coalesce(t1.a, t2.b), 
  coalesce(t1.a, t2.c)

答案 1 :(得分:1)

您可以使用LPAD()进行零填充:

order by
    case when t1.a is not null 
        then lpad(t1.a, 20, 0) 
        else concat(lpad(t2.b, 20, 0) , ',', lpad(t2.c, 20, 0) )
    end asc

另一种方法是两次使用CASE表达式:

order by
    case when a is not null 
        then a
        else b
    end asc,
    case when a is not null 
        then a
        else c
    end asc

Demo