条件ORDER BY取决于列值

时间:2011-09-18 20:59:53

标签: sql sql-server tsql sql-server-2008 sql-order-by

我需要编写一个执行此操作的查询:

SELECT TOP 1 
FROM a list of tables (Joins, etc)
ORDER BY Column X, Column Y, Column Z

如果ColumnXNOT NULL,那么我现在重新选择,使用略有不同的ORDER BY

所以,我做了两次相同的查询。如果第一个在某列中有NULL,我会从我的程序中返回该行。但是,如果值不是NULL - 我必须做另一个相同的选择,除了按不同的一两个顺序排序。

我现在所做的是第一次将它选入临时表。然后检查列的值。如果没有问题,则返回临时表,否则,重做select并返回该结果集。

更多详情:

在英语中,我问数据库的问题是:

返回我对某些球场外观的所有结果(通过索引外键)。我希望大约1000行。按出现日期(列,未编入索引,可为空)排序,最后出现。检查'importId'。如果前1行的导入ID不为NULL,那么我们需要运行相同的查询 - 但这次,按导入ID(最后一个)排序,然后返回该行。或者,只返回原始查询的前1行。

3 个答案:

答案 0 :(得分:3)

我想说最好的方法是在单个查询是一个CASE声明......

SELECT TOP 1 FROM ... ORDER BY 
    (CASE WHEN column1 IS NULL THEN column2 ELSE column1 END) 

答案 1 :(得分:1)

您可以使用COALESCE函数将可为空的列转换为有序的友好值。

 SELECT   CAST(COALESCE(MyColumn, 0) AS money) AS Column1 
 FROM     MyTable
 ORDER BY Column1;

答案 2 :(得分:0)

我在Firebird中使用过(列为数字):

ORDER BY CASE <condition> WHEN <value> THEN <column1>*1000 + <column2> ELSE <column3>*1000 + <column4> END