SQL Server中CGPA计算函数的fun_notnull替代方案咨询
替代自定义
fun_notnull函数的几种SQL Server内置实现方法 当然有不少替代你自定义fun_notnull函数的方案,都是利用SQL Server的内置功能,不需要额外维护自定义函数,可读性和性能都不错。下面根据你描述的逻辑(参数非零/非空返回1)给出具体实现:
1. 使用CASE表达式(兼容性最好)
这是最通用的写法,支持所有SQL Server版本。根据你fun_notnull的实际逻辑选择对应的判断:
- 如果函数逻辑是参数不为NULL则返回1,否则0:
CASE WHEN @s1 IS NOT NULL THEN 1 ELSE 0 END - 如果函数逻辑是参数不为NULL且不等于0则返回1,否则0:
CASE WHEN @s1 IS NOT NULL AND @s1 <> 0 THEN 1 ELSE 0 END
把你的Get_CGPA函数中@DIV的计算替换成这种写法后,代码会变成:
ALTER FUNCTION [dbo].[Get_CGPA] ( @s1 DECIMAL(20, 2), @s2 DECIMAL(20, 2), @s3 DECIMAL(20, 2), @s4 DECIMAL(20, 2), @s5 DECIMAL(20, 2), @s6 DECIMAL(20, 2), @s7 DECIMAL(20, 2), @s8 DECIMAL(20, 2) ) RETURNS DECIMAL(20, 2) AS BEGIN DECLARE @cgpa DECIMAL(20, 2); DECLARE @total DECIMAL(20, 2) = ( COALESCE(@s1, 0) + COALESCE(@s2, 0) + COALESCE(@s3, 0) + COALESCE(@s4, 0) + COALESCE(@s5, 0) + COALESCE(@s6, 0) + COALESCE(@s7, 0) + COALESCE(@s8, 0) ); DECLARE @DIV DECIMAL(20, 2) = ( CASE WHEN @s1 IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN @s2 IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN @s3 IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN @s4 IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN @s5 IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN @s6 IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN @s7 IS NOT NULL THEN 1 ELSE 0 END + CASE WHEN @s8 IS NOT NULL THEN 1 ELSE 0 END ); SET @DIV = NULLIF(@DIV, 0); -- 替代原来的IF判断,简化代码 SET @cgpa = ( @total / @DIV ); RETURN @cgpa END
2. 使用IIF函数(SQL Server 2012+,更简洁)
如果你的SQL Server版本是2012或以上,可以用IIF函数简化代码,它是CASE表达式的语法糖:
- 对应非NULL判断:
IIF(@s1 IS NOT NULL, 1, 0) - 对应非NULL且非零判断:
IIF(@s1 IS NOT NULL AND @s1 <> 0, 1, 0)
替换后的@DIV计算部分:
DECLARE @DIV DECIMAL(20, 2) = ( IIF(@s1 IS NOT NULL, 1, 0) + IIF(@s2 IS NOT NULL, 1, 0) + IIF(@s3 IS NOT NULL, 1, 0) + IIF(@s4 IS NOT NULL, 1, 0) + IIF(@s5 IS NOT NULL, 1, 0) + IIF(@s6 IS NOT NULL, 1, 0) + IIF(@s7 IS NOT NULL, 1, 0) + IIF(@s8 IS NOT NULL, 1, 0) );
额外优化说明
我把你原来的IF(@DIV = 0)判断换成了NULLIF(@DIV, 0),这是SQL Server的内置函数,功能完全一致,但代码更紧凑简洁,你可以直接沿用。
内容的提问来源于stack exchange,提问作者Sharon Saji
相关产品推荐
相关产品推荐

