我有一个非常简单的问题:是否可以根据满足哪个条件对检索到的行进行排序?例如,我有一张人员表,我想检索姓名以“I”开头、以“ster”结尾或包含“lo”的所有人员,根据满足这些条件的条件进行排序。首先是匹配第一个条件的行,然后是匹配第二个条件的行,以此类推。(没有重复:如果一行满足第一个条件,它不应该再次显示第二个条件)
编辑: 我使用 Visual C#,并使用 MS Access 管理数据库。(文件格式为 .mdb,如果重要的话)
谢谢你=)
我有一个非常简单的问题:是否可以根据满足哪个条件对检索到的行进行排序?例如,我有一张人员表,我想检索姓名以“I”开头、以“ster”结尾或包含“lo”的所有人员,根据满足这些条件的条件进行排序。首先是匹配第一个条件的行,然后是匹配第二个条件的行,以此类推。(没有重复:如果一行满足第一个条件,它不应该再次显示第二个条件)
编辑: 我使用 Visual C#,并使用 MS Access 管理数据库。(文件格式为 .mdb,如果重要的话)
谢谢你=)
一般来说,你可以在你的order by
.
这适用于 SQL Server,例如:
order by (case when myCol like 'I%' then 1 when myCol like '%ster' then 2 when myCol like '%lo%' then 3 end)
您使用的是哪个 DBMS?
更新
对于 MS-ACCESS,您可以使用IIF
此答案中所示的语句:
ms-access-complicated-order-by
基于此,您可能需要以下内容:
SELECT *
FROM people
WHERE [name] Like "I*" Or [name] Like "*ster" Or [name] Like "*lo*"
ORDER BY IIf([name] Like "I*", 1, IIf([name] Like "*ster", 2, IIf([name] Like "*lo*", 3, 4)));
像这样的东西应该可以工作:
SELECT * FROM people
ORDER BY
CASE WHEN name LIKE "I%" THEN 0
WHEN name LIKE "%ster" THEN 1
WHEN name LIKE "%lo%" THEN 2
ELSE 3
END ASC;
在 Access 中,您可能不得不求助于嵌套IIF()
的 s:
ORDER BY
IIF( name LIKE "I%", 0,
IIF( name LIKE "%ster%", 1,
IIF( name LIKE "%lo%", 2,
3
) ) ) ASC
该Switch
函数比一堆嵌套IIf
语句更具可读性:
SELECT * FROM [People]
WHERE [Name] Like "I*"
OR [Name] Like "*ster"
OR [Name] Like "*lo*"
ORDER BY Switch([Name] Like "I*", 1,
[Name] Like "*ster", 2,
True, 3)
Switch
通过传递条件参数对来使用:结果。评估参数 1,如果为 true,则函数返回参数 2。如果 arg 1 为 false,则评估 arg 3,依此类推。
请注意True
用作倒数第二个参数的使用,其作用类似于CASE ELSE
.
请注意,根据上下文,您可能需要转换*
为%
. 请参阅为什么从 VB6 应用程序调用 LIKE 时行为不同?了解更多信息。
我用 Postgres 试了一下,但我认为你可以对其他数据库使用类似的技术。我将为每个条件创建一个列,该列返回是否满足条件的布尔表达式。然后,按该列排序:
select
substr(Name, 1, 1) = 'I' as StartsWithI,
Name like '%ster' as EndsWithSter
from MyTable
order by StartsWithI desc, EndsWithSter desc
更新:
该ms-access
标签是在我发布此答案后添加的,但我会保留它以防它对任何人有帮助。