2013-04-07 52 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處理它以同樣的方式