【问题标题】:ColdFusion (Railo) QoQ - Nulls LastColdFusion (Railo) QoQ - Nulls Last
【发布时间】:2013-04-07 19:53:27
【问题描述】:

我的理解是 nulls last 在 QoQ 中是不可能的。无论我是对行进行升序还是降序排序,如何欺骗冷融合最后对空值进行排序?

我尝试在查询的 SELECT 和 ORDER 部分使用 case,但看起来 CF 不喜欢它(在 railo 上运行)

【问题讨论】:

    标签: coldfusion railo cfml qoq


    【解决方案1】:

    可能有更好的选择,但一个简单的技巧是添加一个表示排序优先级的列。为具有非空值的记录分配比空值更高的优先级。然后只需先按优先级值排序,然后再按您想要的任何其他列。由于空值的优先级较低,它们总是排在最后。

        <!--- 1 - non-null values 2 - null values --->
        SELECT 1 AS SortOrder, SomeColumn
        FROM   theQuery
        WHERE  SomeColumn IS NOT NULL
        UNION ALL
        SELECT 2 AS SortOrder, SomeColumn
        FROM   theQuery
        WHERE  SomeColumn IS NULL
        ORDER BY SortOrder, SomeColumn ASC
    

    (值得注意的是,您可以在数据库查询中使用order by 而不是union 执行类似的操作。)

    【讨论】:

    • 在一些人认为我选择了这两个选项之后,最终在 db 查询而不是 QoQ 中实现了它,因为它可能是正确的处理方式。
    • @Daniel - 是的,如果源是 db 查询,那么在 db 级别执行此操作会更有效,避免额外的 union和 QoQ。
    • 在 db 级别执行此类操作通常效率更高,但每隔一段时间使用“最差实践”会产生更好的结果。
    • 是的,但这不是其中之一;-) 数据库在这种类型的操作方面要好得多,并且不会产生在内存中构建重复查询的额外开销。但是,检查可用选项以了解哪些选项表现最佳以及“为什么”总是没有坏处。
    【解决方案2】:

    ColdFusion 和 Railo 上的 QoQ 都具有非常有限的 SQL 词汇,并且没有任何内容涉及如何整理空值。因此,正如@Leigh 所建议的那样,添加另一列 - 没有任何空值 - 代表您想要的排序。

    或者,如果可能的话,最好在数据库中处理所有这些。显然这并不总是可能的(因为您查询的记录集可能一开始就不是来自数据库;-)

    【讨论】:

      【解决方案3】:

      ...还有另一种方法,但它依赖于值为NULL 而不是空的''。 我这里是从记忆中开始的,但本质上就是这样,使用|| 仅在值非空时才有效,因此首先使用空值降序排序,我得到最后的值。

       <cfquery>
          SELECT *, '1' || #sortCol# as isNull
          FROM table
          ORDER BY isNull desc, #sortCol#
       </cfquery>
      

      注意我实际上并不提倡使用它,我不确定 CF 是否会以同样的方式处理它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 2011-04-10
        • 2013-04-24
        • 2020-02-21
        • 2017-11-02
        • 2023-03-19
        • 1970-01-01
        相关资源
        最近更新 更多