Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Sql Server中为表值函数洗牌变量_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

在Sql Server中为表值函数洗牌变量

在Sql Server中为表值函数洗牌变量,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,嗯。要求是说我有一个TVF fn(a,b,cd) 现在,如果这些变量之间存在任何间隙,则必须对它们中的数据进行洗牌。 比如说 输入 1.a=1,b=NULL,c=3,d=4 2.a=NULL,B=NULL,c=3,d=NULL TVF输出 1.a=1,b=3,c=4,空 2.a=3,b=NULL,c=NULL,d=NULL 因此,输出必须具有所有非空值,然后才是空值。 我的意思是,产出不能有任何差距。 你们能给我一个建议吗。我在考虑使用游标? 效率高吗?谢谢。使用Null检查并完成PIVOT D

嗯。要求是说我有一个TVF
fn(a,b,cd)
现在,如果这些变量之间存在任何间隙,则必须对它们中的数据进行洗牌。 比如说

输入
1.a=1,b=NULL,c=3,d=4
2.a=NULL,B=NULL,c=3,d=NULL

TVF输出

1.a=1,b=3,c=4,空

2.a=3,b=NULL,c=NULL,d=NULL

因此,输出必须具有所有非空值,然后才是空值。 我的意思是,产出不能有任何差距。 你们能给我一个建议吗。我在考虑使用游标?
效率高吗?谢谢。

使用
Null
检查并完成
PIVOT

DECLARE @a int = 1, @b int, @c int = 3, @d int = 4

SELECT * FROM
(
    SELECT 
        CHAR(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) + 96) Seq, 
        Value 
    FROM (VALUES(@a), (@b), (@c), (@d)) data(Value)
    WHERE Value IS NOT NULL
) data
PIVOT
(
    MAX(Value) FOR Seq IN ([a], [b], [c], [d])
) p

您可以将
行数
与条件聚合结合使用

CREATE FUNCTION dbo.Fn(
    @a  INT = NULL,
    @b  INT = NULL,
    @c  INT = NULL,
    @d  INT = NULL
)
RETURNS TABLE AS
RETURN

WITH CteRN(RN, N) AS(
    SELECT
        RN = ROW_NUMBER()
                OVER(ORDER BY 
                    CASE WHEN N IS NOT NULL THEN 0 ELSE 1 END,
                    N
                ),
        *
    FROM (
        SELECT @a UNION ALL
        SELECT @b UNION ALL
        SELECT @c UNION ALL
        SELECT @d
    )t(N)
)
SELECT
    a = MAX(CASE WHEN RN = 1 THEN N END),
    b = MAX(CASE WHEN RN = 2 THEN N END),
    c = MAX(CASE WHEN RN = 3 THEN N END),
    d = MAX(CASE WHEN RN = 4 THEN N END)
FROM CteRN