2013-04-07 54 views
2

我的理解是,nulls last对于QoQ是不可能的。我如何欺骗coldfusion进行排序空值,无论我是排序行升序还是降序?ColdFusion(Railo)QoQ - Nulls Last

我使用查询的选择和订购一部分的情况下尝试过,但看起来像CF不喜欢它(上railo运行)

回答

4

有可能是更好的选择,但一个简单的窍门是添加表示排序优先级的列。使用非空值分配记录的优先级高于空值。然后简单地按照优先级值排序,然后按照您想要的其他列进行排序。由于空值具有较低的优先级编号,因此它们将始终排序最后。

<!--- 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可能做你的数据库查询类似的东西。)

+0

后有些人认为我是到了两个选项,并结束在数据库查询而不是QoQ中实现它,因为它可能正确地处理这个问题。 – Daniel 2013-04-08 00:07:06

+0

@Daniel - 是的,如果源是db查询,那么在db级别执行此操作会更有效,避免额外的'union'和QoQ。 – Leigh 2013-04-08 03:13:37

+0

在db级别做这种事通常更高效,但每隔一段时间使用“最差做法”会产生更好的结果。 – 2013-04-08 13:29:04

2

环比上都ColdFusion和Railo有一个非常有限的SQL词汇,并没有任何东西处理如何整理空值。正如@Leigh所建议的,添加另一列 - 没有任何空值 - 表示您想要的排序。或者更好,如果可能的话,在DB中处理所有这些。显然,这并不总是可能的(因为你查询的记录集可能不是来自数据库;-)

0

......还有一种方法,但它依赖于值为NULL和不为空''。 我从这里回忆起,但实际上它是这样的,使用||只适用于值非空的情况,所以首先使用空值降序排序,最后得到值。

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

注意我实际上并不主张使用的这一点,我不知道是否会CF处理它以同样的方式