[SQL]ISNULL()函式对於资料型态的隐性规则

ISNULL()函式对於资料型态的隐性规则

情境

想在Sql server要用 特定学生姓名 去查阅此学生是否已注册(已注册为1,未注册为0)若无此学生资料则回传-1

SQL 资料表与型态范例

1.先创造资料表名为: Students
2.定义资料表栏位与其型态
栏位名称 资料型态
student_id bigint
student_name varchar(30)
is_registered bit
3.新增几个学生范例供参考
student_id student_name is_regesitered
1 Gary 0
2 Max 0
3 Tina 1
4 Linda 0

SQL语法与遇到问题

ISNULL ( 检查运算式 , 取代值 )
检查运算式内结果是否为null,若为null则用取代值取代

把找出is_registered的sql贴到检查运算式,取代值设为-1表示没有资料

DECLARE @IsRegistered smallint;
DECLARE @Name nvarchar(30)='Cleo';
SET @IsRegistered= ISNULL((SELECT TOP(1) is_registered FROM Students WITH(NOLOCK) WHERE student_name =@Name),-1);
SELECT @IsRegistered;

因为没有Cleo这位学生,故以为这样直观的写法会是预期的结果:-1
但得到的@IsRegistered却是1

原因

後来查了微软文件关於ISNULL的功能解释

其中提到了

check_expression
为要检查 NULL 的运算式。 check_expression 可为任何类型。
replacement_value
为 check_expression 是 NULL 时,要传回的运算式。 replacement_value 必须是能够隐含转换成 check_expression 类型的类型。

replacement_value 必须是能够 隐含转换 成 check_expression 类型的类型
也就是说上述的sql语法,因为我们的check_expression

SELECT TOP(1) is_registered FROM Students WITH(NOLOCK) WHERE student_name =@Name

取出来的is_registered在db内是设定成 bit (只有0或1的选项)
而我们的取代值-1不可能转换成bit...

解决方法

其实解决方法很简单
把得出来的is_registered用smallint型态的变数取存入再进行ISNULL()自我判定结果就好

SET @IsRegistered= (SELECT TOP(1) is_registered FROM Students WITH(NOLOCK) WHERE student_name =@Name);
SET @IsRegistered = ISNULL(@IsRegistered,-1);

就是这麽简单
并不是太复杂或是深奥的观念
但是有时候这种基础规则没有好好记得反而增加找问题的时间成本...

tags: sql database

<<:  如何取出物件中重复/不重复的值

>>:  [NET Core]Epplus於linux环境下无预设lib的报错与解决

【17】训练到一半遇到 nan 吗? 梯度爆炸与梯度消失的测试实验

Colab连结 今天大家介绍 Gradient Exploding (梯度爆炸) 与 Gradien...

如何下载高质量的 Twitter 影片

Twitter 上最受欢迎的功能就是「趋势」功能了。通过该功能,人们可以轻松了解世界各地的热点新闻,...

创建App-FB sign in my App

创建App-FB sign in my App 本App设想登入方法有Google、AppleID、...

TailwindCSS 从零开始 - 价目表卡片实战 - 基础卡片样式

上一篇完成了基础设置,这次就来建立一个基础卡片。 设定基础卡片样式外观 标题部分因为了整个内容更完...

D-30-安装 vscode ? dotnet sdk

离实习结束还有30天 实习生小光第一天到新公司实习,什麽都不懂的他到底会遇到什麽事情呢,让大家想想第...