按SQL顺序自定义排序?

时间:2011-10-22 21:00:18

标签: sql sorting

以下是我要解决的情况:

我有一个可以返回一组记录的查询。被排序的字段可能有许多不同的值 - 为了这个问题,我们会说这个值可以是A,B,C,D,E或Z

现在,根据查询结果,排序需要表现如下: 如果只找到A-E记录,那么“自然地”对它们进行排序是可以的。但是如果结果中有Z记录,那么它需要是查询中的第一个结果,但其余记录应该是“自然”排序顺序。

例如,如果找到A C D,则结果应为

A
C
D

但如果找到A B D E Z,则应对结果进行排序:

Z
A
B
D
E

目前,查询如下:

SELECT NAME, SOME_OTHER_FIELDS FROM TABLE ORDER BY NAME

我知道我可以编写一个排序函数来做我想要的,但由于我如何使用结果,我似乎无法使用,因为结果是由第三方库处理的,我是只是传递SQL查询。然后处理结果,似乎没有钩子可以对结果进行排序,只是将结果传递给库。它需要自己进行SQL查询,而且我无法访问库的源代码。

那么对于你们所有的SQL专家来说,你能为我提供一个能够做我想做的事吗?

3 个答案:

答案 0 :(得分:35)

您如何识别Z记录?是什么让它与众不同?理解了这一点后,将其添加到ORDER BY子句中。

SELECT name, *
FROM [table]
WHERE (x)
ORDER BY
    (
     CASE
       WHEN (record matches Z) THEN 0
       ELSE 1
     END
    ),
    name

这样,只有Z记录匹配第一个排序,所有其他记录将按二阶排序(名称)排序。如果您确实不需要,可以排除二阶排序。

例如,如果Z是字符串'Bob',那么您的查询可能是:

SELECT name, *
FROM [table]
WHERE (x)
ORDER BY
    (
     CASE
       WHEN name='Bob' THEN 0
       ELSE 1
     END
    ), name

我的示例适用于T-SQL,因为您没有提到您正在使用的数据库。

答案 1 :(得分:2)

有许多方法可以解决这个问题,最佳解决方案取决于您未讨论的一些因素,例如A..Z值的性质以及您正在使用的数据库产品。 / p>

如果您只有一个值必须排在最前面,您可以ORDER BY将该值映射到最低排序值的表达式(使用CASEIIFIFEQ,具体取决于您的数据库。)

如果您有多个不同的特殊排序值,可以ORDER BY表达更复杂的表达式,或者您可以UNION合并多个SELECT,其中一个SELECT用于默认排序以及每个特殊值的额外SELECTSELECT将包含一个排序列。

最后,如果您有很多值,可以将排序值放入一个单独的表格中,并将该表格JOIN放入您的查询中。

答案 2 :(得分:1)

不确定您使用的是什么数据库 - 以下适用于Oracle:

SELECT 
NAME, 
SOME_OTHER_FIELDS, 
DECODE (NAME, 'Z', '_', NAME ) SORTFIELD 
FROM TABLE 
ORDER BY DECODE (NAME, 'Z', '_', NAME ) ASC
相关问题