当前位置: 首页 > 面试题库 >

SQL Server窗口函数子句中的条件排序顺序

燕钟展
2023-03-14
问题内容

因此,这不是您的平均“条件排序依据”问题……我这里有一个非常棘手的问题。:-)我想允许我的存储过程为结果提供条件排序顺序。通常,可以通过以下方式完成此操作:

SELECT *
INTO #ResultsBeforeSubset
FROM
    MyTable
ORDER BY
    CASE WHEN @SortAscending=1 THEN 'SortColumn' END ASC,
    CASE WHEN @SortAscending=0 THEN 'SortColumn' END DESC

我想CASE围绕实际ASC/声明DESC,但这不起作用。上面的方法起作用的原因是因为,当@SortAscending不等于给定值时,SQL
Server会将CASE语句转换为常数NULL。因此,如果@SortAscending为0,则实际上有:

ORDER BY
    NULL ASC,
    SortColumn DESC

那么,第一个排序表达式什么也不做。之所以可行,是因为SELECT您可以在常规语句中在ORDER BY子句中使用常量。

麻烦的是,我在存储过程中进行排序的时间是在SELECT包含窗口函数的语句期间ROW_NUMBER()。因此,我想将该CASE语句放在其OVER子句中,如下所示:

SELECT *
INTO #ResultsBeforeSubset
FROM (
    SELECT
        ROW_NUMBER() OVER (
            ORDER BY
                CASE WHEN @SortAscending=1 THEN rowValues.[SortColumn] END ASC,
                CASE WHEN @SortAscending=0 THEN rowValues.[SortColumn] END DESC
        ) AS RowNumber,
        *
    FROM (
        -- UNIONed SELECTs returning rows go here...
    ) rowValues
) rowValuesWithRowNum

不幸的是,这会在您运行存储过程时导致以下错误:

Windowed functions do not support constants as ORDER BY clause expressions.

因为这是窗口函数的子句,所以将CASE语句转换为常量NULL是无效的。

谁能想到有条件地改变UNIONedSELECT的排序顺序,并为这些排序结果产生的每一行分配行号的方法?我知道我可以求助于将整个查询构造为字符串并将其作为完全动态的SQL执行,但是如果可能的话,我宁愿避免这样做。


问题答案:

您可以在两个方向分配行号,然后在外部选择一个order by

select  *
from    (
        select  row_number() over (order by SortColumn) rn1
        ,       row_number() over (order by SortColumn) rn2
        ,       *
        from    @t
        ) as SubQueryAlias
order by
        case when @asc=1 then rn1 end
,       case when @asc=0 then rn2 end desc


 类似资料:
  • 问题内容: 我想知道是否有按IN()子句中的值顺序进行排序的方法(可能是一种更好的方法)。 问题是我有2个查询,一个查询获取所有ID,第二个查询获取所有信息。第一个创建我要第二个排序的ID的顺序。这些ID以正确的顺序放入IN()子句中。 因此,它类似于(极其简化): 问题在于第二个查询不会以将ID放入IN()子句中的顺序来返回结果。 我发现的一种解决方案是将所有ID放入具有自动递增字段的临时表中,

  • 问题内容: 我想知道是否有按IN()子句中的值顺序进行排序的方法(可能是一种更好的方法)。 问题是我有2个查询,一个查询获取所有ID,第二个查询获取所有信息。第一个创建我要第二个排序的ID的顺序。这些ID以正确的顺序放入IN()子句中。 因此,它类似于(极其简化): 问题在于第二个查询不会以将ID放入IN()子句中的顺序来返回结果。 我发现的一种解决方案是将所有ID放入具有自动递增字段的临时表中,

  • 问题内容: 我正在从具有整数id值的大型表(数百万行)中选择一组帐户记录。从某种意义上说,查询是最基本的。我正在做的是建立一个大型的逗号分隔列表,并将其作为“ in”子句传递到查询中。现在,结果是完全无序的。我想做的是按“ in”子句中的值顺序返回结果。 我想我将不得不建立一个临时表并进行联接,这是我想避免的,但可能无法做到。 有什么想法吗?现在,由于我们正试图限制输出大小,每个查询的大小上限为6

  • 问题内容: 假设我有一个漫长而昂贵的查询,里面挤满了条件,搜索了大量的行。我还有一个特殊条件,例如公司ID,它将限制需要大量搜索的行数,将其范围从数十万缩小到几十。 我这样做是否会对MySQL性能产生任何影响: 或这个: 问题答案: 不,顺序应该不会有太大的不同。当发现哪些行与条件匹配时,将针对每一行检查整个条件(通过布尔逻辑组合的所有子条件)。 一些智能数据库引擎将尝试猜测条件的哪些部分可以更快