【问题标题】:Sorting after union all or order by case when在 union all 或 order by case when 之后排序
【发布时间】:2013-05-23 21:28:52
【问题描述】:

为了测试这些查询,我在 Microsoft Access 的 SQL 查询向导中运行它们。我正在尝试修改现有的 php 文件,以便在顶部显示高优先级状态警报(O 和 P),然后按 opslogid 以降序排列。在没有更多的 O 和 P 状态警报后,我想显示其余的状态警报(A、I、R),按 opslogid 降序排列。这是示例数据和所需的输出:

tblOpslog

opslogid = 9999, 9998, etc.

status = R, O, I, A, P

opslogid                               status

9999                                       P

9996                                       P

9994                                       O

9991                                       O

9998                                       I

9997                                       I

9980                                       A

9979                                       A

9978                                       A

9930                                       R

9928                                       R

我的同事建议我使用 union all 命令,结果我想出了这个:

注意:WHERE DELETED AND NO VIEW MUST REMAIN IN QUERY, IT IS VITAL IN THE OUTPUT OF THE DATABASE”。我也不能对数据库本身进行任何更改。

select * from (SELECT * FROM tblOpslog
Where Deleted = No AND Noview = No AND status in ('O','P'))
union all
select * from (Select * FROM tblOpslog Where Deleted = No AND Noview = No AND status in ('I','R', 'A'))
Order by status, opslogid DESC;

这个的输出是:

opslogid                               status

9980                                       A

9979                                       A

9978                                       A

9998                                       I

9997                                       I

9994                                       O

9991                                       O

9999                                       P

9996                                       P

9930                                       R

9928                                       R

我也试过这个代码:

SELECT *
FROM tblOpsLog
WHERE Deleted = No AND Noview = No AND status IN ('A', 'I', 'R', 'O', 'P')
ORDER BY CASE WHEN status IN ('O', 'P') then 1
              ELSE 2
         END, opslogid DESC

这给了我这个错误:

Syntax error (missing oeprator) in query expression 'CASE WHEN status IN ('O','P') then 1 ELSE 2 End'.

如果有人可以建议修复/添加到代码中以显示所需的输出,我将不胜感激?谢谢

【问题讨论】:

  • 查看这篇文章,了解如何为您的优先级字母应用自定义排序顺序:stackoverflow.com/questions/2175439/mysql-custom-sort 然后只需使用一个按优先级排序的选择,然后是 id。虽然不确定性能...
  • microsoft access 是否支持 Case When 语句?它给了我一个错误。有没有办法解决这个问题?
  • 你打算在你的 php 文件中使用 MS Access 吗?如果不是,那么您能否针对您将使用的数据库进行测试,而不用担心为什么您的测试不起作用?作为一个完整的猜测,您是否尝试在 CASE 周围放置括号? IE。 SELECT ... ORDER BY (CASE ... END), opslogid DESC - 我没有理由期望它会起作用,但这是我会尝试的。
  • 是的,我确实尝试在机箱周围放置括号,但还是没有成功。
  • 是的,我将在我的 php 文件中使用 MS Access。

标签: php sql sorting sql-order-by


【解决方案1】:

您使用的 Access 不支持 case 语句。使用 Access 语法试试这个版本:

SELECT *
FROM tblOpsLog
WHERE Deleted = No AND Noview = No AND status IN ('A', 'I', 'R', 'O', 'P')
ORDER BY iif(status IN ('O', 'P'), 1, 2),
         opslogid DESC

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT * FROM tblOpsLog WHERE Deleted = No AND Noview = No 
    AND status IN ('A', 'I', 'R', 'O', 'P')
    ORDER BY CASE status WHEN 'P' then 1
    WHEN 'O' then 1
    ELSE 2
    END, opslogid DESC
    

    【讨论】:

    • 它给了我这个错误:查询表达式中的语法错误(缺少运算符)'Case status WHEN 'P' then 1 WHEN 'O' then 1 ELSE 2 END'。
    • 请注意,我正在使用 microsoft access 数据库运行此 sql 查询,因此可能存在一些限制。有没有办法解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多