小编典典

在SQL中按子句自定义排序?

sql

这是我要解决的情况:

我有一个查询,可以返回一组记录。排序依据的字段可以有许多不同的值-出于这个问题的考虑,我们将说该值可以是A,B,C,D,E或Z

现在,根据查询的结果,排序的行为如下:如果仅找到AE记录,则可以“自然”地对其进行排序。但是,如果结果中有Z记录,则它必须是查询中的第一个结果,但其余记录应采用“自然”排序顺序。

例如,如果找到了ACD,则结果应为

A
C
D

但是,如果找到了ABDEZ,则应对结果进行排序:

Z
A
B
D
E

当前,查询看起来像:

SELECT NAME, SOME_OTHER_FIELDS FROM TABLE ORDER BY NAME

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

因此,对于您在那里的所有SQL专家,您能否为我提供一个查询,该查询将满足我的要求?


阅读 162

收藏
2021-03-17

共1个答案

小编典典

您如何识别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的,因为您没有提到正在使用哪个数据库。

2021-03-17