根据满足条件的顺序排序?

时间:2012-04-10 17:49:39

标签: sql ms-access sql-order-by

我有一个非常简单的问题:是否可以根据满足的条件对检索的行进行排序? 例如,我有一个人的表,我想要检索所有名字以“I”开头,或者以“ster”结尾,或者包含“lo”的人,根据满足这些条件的顺序排序。首先是与第一个条件匹配的行,然后是与第二个条件匹配的行,依此类推。 (没有重复:如果某行符合第一个条件,则不应再次显示第二个条件)

修改 我使用Visual C#,我使用MS Access管理数据库。 (文件格式为.mdb,如果重要的话)

谢谢=)

4 个答案:

答案 0 :(得分:7)

一般来说,您可以在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)));

答案 1 :(得分:5)

这样的事情应该有效:

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

答案 2 :(得分:1)

我用Postgres给了这个镜头,但我认为你可以使用与其他DB类似的技术。我会为每个条件创建一个列,它返回一个是否满足条件的布尔表达式。然后,按该列排序:

select
   substr(Name, 1, 1) = 'I' as StartsWithI,
   Name like '%ster' as EndsWithSter
from MyTable
order by StartsWithI desc, EndsWithSter desc

<强>更新

我发布此答案后添加了ms-access标记,但我会将其保留,以防万一。

答案 3 :(得分:1)

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,如果为真,则函数返回参数2.如果arg 1为假,则计算arg 3,等等。

请注意使用True作为倒数第二个参数,其作用类似于CASE ELSE

请注意,根据具体情况,您可能需要将*转换为%。有关详细信息,请参阅Why does LIKE behave differently when being called from VB6 app?