在Sql Server中为表值函数洗牌变量
嗯。要求是说我有一个TVF在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
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