我的理解是,nulls last
对于QoQ是不可能的。我如何欺骗coldfusion进行排序空值,无论我是排序行升序还是降序?ColdFusion(Railo)QoQ - Nulls Last
我使用查询的选择和订购一部分的情况下尝试过,但看起来像CF不喜欢它(上railo运行)
我的理解是,nulls last
对于QoQ是不可能的。我如何欺骗coldfusion进行排序空值,无论我是排序行升序还是降序?ColdFusion(Railo)QoQ - Nulls Last
我使用查询的选择和订购一部分的情况下尝试过,但看起来像CF不喜欢它(上railo运行)
有可能是更好的选择,但一个简单的窍门是添加表示排序优先级的列。使用非空值分配记录的优先级高于空值。然后简单地按照优先级值排序,然后按照您想要的其他列进行排序。由于空值具有较低的优先级编号,因此它们将始终排序最后。
<!--- 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
可能做你的数据库查询类似的东西。)
环比上都ColdFusion和Railo有一个非常有限的SQL词汇,并没有任何东西处理如何整理空值。正如@Leigh所建议的,添加另一列 - 没有任何空值 - 表示您想要的排序。或者更好,如果可能的话,在DB中处理所有这些。显然,这并不总是可能的(因为你查询的记录集可能不是来自数据库;-)
......还有一种方法,但它依赖于值为NULL
和不为空''
。 我从这里回忆起,但实际上它是这样的,使用||
只适用于值非空的情况,所以首先使用空值降序排序,最后得到值。
<cfquery>
SELECT *, '1' || #sortCol# as isNull
FROM table
ORDER BY isNull desc, #sortCol#
</cfquery>
注意我实际上并不主张使用的这一点,我不知道是否会CF处理它以同样的方式
后有些人认为我是到了两个选项,并结束在数据库查询而不是QoQ中实现它,因为它可能正确地处理这个问题。 – Daniel 2013-04-08 00:07:06
@Daniel - 是的,如果源是db查询,那么在db级别执行此操作会更有效,避免额外的'union'和QoQ。 – Leigh 2013-04-08 03:13:37
在db级别做这种事通常更高效,但每隔一段时间使用“最差做法”会产生更好的结果。 – 2013-04-08 13:29:04