【发布时间】:2013-04-07 19:53:27
【问题描述】:
我的理解是 nulls last 在 QoQ 中是不可能的。无论我是对行进行升序还是降序排序,如何欺骗冷融合最后对空值进行排序?
我尝试在查询的 SELECT 和 ORDER 部分使用 case,但看起来 CF 不喜欢它(在 railo 上运行)
【问题讨论】:
标签: coldfusion railo cfml qoq
我的理解是 nulls last 在 QoQ 中是不可能的。无论我是对行进行升序还是降序排序,如何欺骗冷融合最后对空值进行排序?
我尝试在查询的 SELECT 和 ORDER 部分使用 case,但看起来 CF 不喜欢它(在 railo 上运行)
【问题讨论】:
标签: coldfusion railo cfml qoq
可能有更好的选择,但一个简单的技巧是添加一个表示排序优先级的列。为具有非空值的记录分配比空值更高的优先级。然后只需先按优先级值排序,然后再按您想要的任何其他列。由于空值的优先级较低,它们总是排在最后。
<!--- 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 执行类似的操作。)
【讨论】:
union和 QoQ。
ColdFusion 和 Railo 上的 QoQ 都具有非常有限的 SQL 词汇,并且没有任何内容涉及如何整理空值。因此,正如@Leigh 所建议的那样,添加另一列 - 没有任何空值 - 代表您想要的排序。
或者,如果可能的话,最好在数据库中处理所有这些。显然这并不总是可能的(因为您查询的记录集可能一开始就不是来自数据库;-)
【讨论】:
...还有另一种方法,但它依赖于值为NULL 而不是空的''。
我这里是从记忆中开始的,但本质上就是这样,使用|| 仅在值非空时才有效,因此首先使用空值降序排序,我得到最后的值。
<cfquery>
SELECT *, '1' || #sortCol# as isNull
FROM table
ORDER BY isNull desc, #sortCol#
</cfquery>
注意我实际上并不提倡使用它,我不确定 CF 是否会以同样的方式处理它
【讨论】: