用于排序的快速SQL问题

时间:2011-02-10 13:50:45

标签: 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'将位于顶部。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

您可以列出多个ORDER BY列。所以你可以做ORDER BY e.preference, CASE WHEN LOWER(LEFT(E.name, 1)) BETWEEN \'a\' AND \'z\' THEN 0 ELSE 1 END, E.name ASC,如果你的非首选行的首选项为NULL,那么你将首先获得所有首选项(按照该组中现有标准排序),然后是所有非首选项(按照现有标准排序)那个小组)