按SQL顺序自定义排序?

Zek*_*ell 8 sql sorting

这是我想要解决的情况:

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

现在,根据查询的结果,排序需要表现如下:如果只找到AE记录,那么"自然"排序它们是可以的.但是如果结果中存在Z记录,那么它需要是查询中的第一个结果,但其余记录应该是"自然"排序顺序.

例如,如果找到ACD,那么结果应该是

A
C
D
Run Code Online (Sandbox Code Playgroud)

但是如果找到ABDEZ,那么结果应该排序:

Z
A
B
D
E
Run Code Online (Sandbox Code Playgroud)

目前,查询看起来像:

SELECT NAME, SOME_OTHER_FIELDS FROM TABLE ORDER BY NAME
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*ngs 36

你如何识别Z记录?是什么让它与众不同?一旦理解了,就将它添加到ORDER BY子句中.

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

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

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

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

我的例子是针对T-SQL的,因为你还没有提到你正在使用哪个数据库.