You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:27:50