以下是我要解决的情况:
我有一个可以返回一组记录的查询。被排序的字段可能有许多不同的值 - 为了这个问题,我们会说这个值可以是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专家来说,你能为我提供一个能够做我想做的事吗?
答案 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
将该值映射到最低排序值的表达式(使用CASE
或IIF
或IFEQ
,具体取决于您的数据库。)
如果您有多个不同的特殊排序值,可以ORDER BY
表达更复杂的表达式,或者您可以UNION
合并多个SELECT
,其中一个SELECT
用于默认排序以及每个特殊值的额外SELECT
。 SELECT
将包含一个排序列。
最后,如果您有很多值,可以将排序值放入一个单独的表格中,并将该表格JOIN
放入您的查询中。
答案 2 :(得分:1)
不确定您使用的是什么数据库 - 以下适用于Oracle:
SELECT
NAME,
SOME_OTHER_FIELDS,
DECODE (NAME, 'Z', '_', NAME ) SORTFIELD
FROM TABLE
ORDER BY DECODE (NAME, 'Z', '_', NAME ) ASC