繁体   English   中英

从表值 function 返回的订购结果

[英]Ordering results returned from table valued function

我有一个用户定义的 function 返回一个表。 问题是这个表需要根据复杂的标准进行排序,因此它不应该由 function 调用者排序,而是需要在 function 本身中排序。

简化示例

select * 
from custom_function('param1', 'param2' ...) 
order by 
complex criteria 1,
complex criteria 2....

是否可以将订单移动到 function 并从 select 获得有序结果?

您不能直接对表进行排序,但是可以添加一列以指定顺序。 因此,将函数定义为:

select . . .,
       row_number() over (order by <complex ordering criteria>) ord
. . .

然后,您可以将其称为:

select f.*
from dbo.func(. . .) f
order by ord;

您可以如下所示使用order by。 让表值函数为:

    CREATE FUNCTION ReturnTableTOrder()
    RETURNS @returnList TABLE (Col1 char(1), Col2 int)
    AS
    BEGIN   

         INSERT INTO @returnList
         SELECT 'A',5 Union All
         SELECT 'D',2 Union All
         SELECT 'B',4 Union All
         SELECT 'E',1 Union All
         SELECT 'C',3 

     RETURN

    END

您可以按列序号进行订购

    Select * from ReturnTableTOrder()
    Order by 1

o / p

Col1  Col2
 A     5
 B     4
 C     3
 D     2
 E     1

对于以下查询,

    Select * from ReturnTableTOrder()
    Order by 2

输出是

Col1  Col2
 E     1
 D     2
 C     3
 B     4
 A     5

如果您准备接受唯一的排序结果,那么执行此操作的一种方法是将 PK 添加到返回表中。

CREATE OR ALTER FUNCTION MyFunc ()
    RETURNS @tblArray TABLE (Element VARCHAR(900) PRIMARY KEY WITH (IGNORE_DUP_KEY = ON))

AS BEGIN

    INSERT INTO @tblArray VALUES ('c'),('b'),('a')  
    RETURN

END

这将返回一个记录集,其中包含

Element
a
b
c

注意:这个问题很旧,但还没有得到正确的回答,除了说除了添加一个排序列之外无法完成,这不是 OP 要求的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM