【问题标题】:mysql order by casemysql 按大小写排序
【发布时间】:2016-08-09 11:48:37
【问题描述】:

我尝试在以下查询的每个类别中获取有关 NAME 的 ASC 排序结果,但无法得出该结果。

select ID,NEWID,NAME from table 
ORDER BY CASE 
     WHEN ID = PID THEN 1 
     WHEN NEWID IS NOT NULL THEN 2 
     ELSE 3
     END;

PID 是输入,它返回一条记录并且应该首先出现,其余的应该基于 NEWID。但我希望记录根据 NAME 对 2 个部分进行排序(NEWID 不是 null 和 Null)。 请帮忙

【问题讨论】:

    标签: mysql sql-order-by case


    【解决方案1】:

    您非常接近...如果您想将“NewID”浮动到顶部,请更正设置为 1 的情况。然后所有其他人的 ID 为 2。现在,根据名称,因此在每个相应的 1 或 2 中,名称的排序如下:

    select ID,NEWID,NAME from table 
    ORDER BY CASE 
         WHEN ID = PID THEN 1 
         WHEN NEWID IS NOT NULL THEN 2 
         ELSE 3
         END,
         NAME;
    

    例如:如果您的数据有

    ID  Name   NewID
    1   X      17
    2   R      21
    3   F      null
    4   B      null
    5   H      19
    6   L      41
    

    而您正在寻找“PID”(参数 ID)= 5。订单将导致 ID#5 位于第一个位置

    CASE FLAG    ID  Name   NewID
    1            5   H      19   (ID=5 floats to the top of the list)
    
    2            6   L      41   (all others that HAD a NewID value)
    2            2   R      21
    2            1   X      17
    
    3            4   B      null (all the rest without a NewID)
    3            3   F      null
    

    注意在每个“案例标志”中,它们按名称排序(即使我使用简单的一个字母字符作为上下文)

    【讨论】:

    • @Chandru,不客气...另外,请查看帮助 -> 了解问答的网站礼仪,以便其他人知道问题已得到解决,如果他们的工作遇到类似问题,其他人可以找到有效的方法.
    【解决方案2】:

    你应该添加一个 my_order 列

    select 
        ID
      , NEWID
      , NAME
      , CASE 
           WHEN ID = PID THEN 1 
           WHEN NEWID IS NOT NULL THEN 2 
           ELSE 3
         END as my_order 
    from table 
    ORDER BY my_order;
    

    【讨论】:

    • 感谢@scaisEdge,这将在我的结果中添加新列,我认为在传递给应用程序时不需要它
    • 对于您需要的订购方式..在应用程序中就足够了,不要使用列..
    • 谢谢,正是我需要的——因为我现在不知道是什么情况导致了我的订单:-)
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多