sql - 快速 SQL 排序问题

标签 sql mysql sorting

我的 sql 语句末尾有这个排序 sql:

ORDER BY CASE WHEN LOWER(LEFT(E.name, 1)) BETWEEN 'a' AND 'z' 
              THEN 0 ELSE 1 END, E.name ASC

以这种方式对结果进行排序:名称首先以字母开头,然后是数字。

我如何添加这个:首先,将首选项设置为 true 的名称,然后是我已经拥有的所有名称。即:E.preference='true' 将位于顶部。

最佳答案

您不能在现有排序之前添加偏好排序吗?

ORDER BY Case When e.Preference = 'true' then 0 else 1 end,
CASE WHEN LOWER(LEFT(E.name, 1)) BETWEEN \'a\' AND \'z\' THEN 0 ELSE 1 END, E.name ASC

编辑

或者,如果您想以任意顺序首先获得所有preference = true,然后使用现有方法进行排序,那么我认为您可以使用:

Order By Case When e.Preference = 'true' Then 0  
         Else
              CASE 
                  WHEN LOWER(LEFT(E.name, 1)) BETWEEN \'a\' AND \'z\' THEN 1 
                  ELSE 2 END
         End, e.name asc

编辑2

更进一步,您可以先获得所有 preference = true,然后使用当前方法对它们进行排序,然后对所有 preference=false 进行排序

Order By Case When e.Preference = 'true' Then 
                  CASE 
                  WHEN LOWER(LEFT(E.name, 1)) BETWEEN \'a\' AND \'z\' THEN 0 
                  ELSE 1 END  
         Else
              CASE 
                  WHEN LOWER(LEFT(E.name, 1)) BETWEEN \'a\' AND \'z\' THEN 2 
                  ELSE 3 END
         End, e.name asc

但我不确定这会如何影响查询的性能。

关于sql - 快速 SQL 排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4957888/

相关文章:

sql - 为不存在日期的每个组获取额外的行

mysql - 我应该聚合吗?这是一个明智的做法吗?

c# - 在 C# 中对 XmlSerializer 的输出进行排序

r - 合并两个数据框,同时保持原始行顺序

php - 初学php数据库查询

mysql - 每月涨幅如何计算?

sql 包不执行 printf

mysql - 如何在两个表之间找到合适的用户

php - 添加时间到mysql时间戳列,有条件

php - 将变量设置为数组 php mysql 中的第一个选项