【问题标题】:Order rows according to which condition is met?根据满足哪个条件对行进行排序?
【发布时间】:2012-04-11 02:58:48
【问题描述】:

我有一个非常简单的问题:是否可以根据满足哪个条件对检索到的行进行排序? 例如,我有一张人员表,我想检索姓名以“I”开头、以“ster”结尾或包含“lo”的所有人员,根据满足这些条件的条件进行排序。首先是匹配第一个条件的行,然后是匹配第二个条件的行,以此类推。 (不重复:如果一行满足第一个条件,它不应该再次显示第二个条件)

编辑: 我使用 Visual C#,并使用 MS Access 管理数据库。 (文件格式是 .mdb,如果重要的话)

谢谢你=)

【问题讨论】:

  • 无法通过标准 sql。如果您将结果集检索到 Java、C# 等中,您可以通过编程方式完成此操作
  • 不,在标准 SQL 中完全可以。根据一些细节,这只是涉及一点点。
  • 真正的问题是 Access 支持的标准 SQL 子集比更大的 DBMS(如 SQL Server、Oracle、DB2 等)更小,因此可能不支持所有不同的方式来做到这一点.

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


【解决方案1】:

一般来说,您可以在order by 中添加case 语句。

这适用于 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)));

【讨论】:

  • @Itamar Marom,如果这行得通,请告诉我,如果语法稍有偏差,请在此处编辑最终的 Access 查询(不幸的是,我现在无法检查)。
【解决方案2】:

这样的事情应该可以工作:

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

【讨论】:

    【解决方案3】:

    我用 Postgres 试了一下,但我认为您可以对其他数据库使用类似的技术。我将为每个条件创建一个列,该列返回是否满足条件的布尔表达式。然后,按该列排序:

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

    更新:

    ms-access 标签是在我发布此答案后添加的,但我会保留它以防它对任何人有所帮助。

    【讨论】:

      【解决方案4】:

      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 通过传递条件的参数对来使用:result。计算参数 1,如果为 true,则函数返回参数 2。如果 arg 1 为 false,则计算 arg 3,以此类推。

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

      请注意,根据上下文,您可能需要将* 转换为%。请参阅Why does LIKE behave differently when being called from VB6 app? 了解更多信息。

      【讨论】:

        猜你喜欢
        • 2010-10-03
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 2020-10-27
        • 2023-02-01
        • 2013-09-30
        • 1970-01-01
        相关资源
        最近更新 更多