我在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'将位于顶部。
答案 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,那么你将首先获得所有首选项(按照该组中现有标准排序),然后是所有非首选项(按照现有标准排序)那个小组)