如何封装语句并在Order by Clause中使用它

时间:2016-10-19 08:29:37

标签: sql sql-server-2008 tsql

我需要封装这个case语句并简化我的查询,因为我需要使用多个临时表生成报告。我不想在每个地方使用案例陈述。

Select * from #SumED_DB 
order by case  
when [type] = 'Within 30 days' then 1
when [type] = 'Within 60 days' then 2
when [type] = 'Within 90 days' then 3
when [type] = 'Within 120 days' then 4
when [type] = 'Greater than 120 days' then 5
when [type] = 'Blank' then 6
else 7
end

如何解决此问题?我知道功能对我有帮助,但我将如何实现呢?

我希望我的查询看起来像:

select * from #SumED_DB order by (function);

我已经使用了一个表并加入了它,然后使用了order by子句。 我怎么能用函数做到这一点?

1 个答案:

答案 0 :(得分:2)

除了创建要加入的查找表以进行排序之外,我认为函数或重复代码是您唯一的其他选项。通常,您希望避免调用函数,因为它们不仅会为每一行they also prohibit parallelism生成单独的调用,这会降低您的查询性能。

如果您的数据集始终是一个小的汇总表 - 因为这看起来来自您的命名约定和要求 - 这可能不是那么大的折衷。

创建你的功能:

create function dbo.usp_TypeOrder (@Type nvarchar(100))
returns int
as
begin
return (select case @Type  
                when 'Within 30 days' then 1
                when 'Within 60 days' then 2
                when 'Within 90 days' then 3
                when 'Within 120 days' then 4
                when 'Greater than 120 days' then 5
                when 'Blank' then 6
                else 7
                end
        )
end;

并在您的查询中使用它:

select *
from #SumED_DB
order by dbo.usp_TypeOrder([type]);