首页 > 解决方案 > SET 语句将 0 视为 null

问题描述

我不怎么解释我的问题,但我会尽力说清楚。

我正在尝试创建一个用于处理假期请求的存储过程。我有两张桌子:

表 A 包含假期的名称和一年中可以请求的最大天数。它是这样的

TABLE A
------------------------
| HOLIDAY NAME| QUOTA  |
------------------------
| Yearly      | 40     |
------------------------

表 B 跟踪所有假期请求并自动更新特定假期的剩余天数。多次请求后,“余额”列确定还有多少天可用。在下面的情况下,最后一次请求后余额为 0。

TABLE B
----------------------------------------------------
| HOLIDAY NAME | FROM       | TO         | BALANCE |
----------------------------------------------------
| Yearly       | 2019-10-12 | 2019-10-22 | 0       |
----------------------------------------------------

我想要的是,只要余额为 0,新假期的请求就不应该通过。为了实现这一点,我应用了以下逻辑(我的程序的摘录):

DECLARE @quota_requested int, @quota int, @balance int, @balance_new int, @period_from date, @period_to date
SET     @period_from = '2019-12-27'
SET     @period_to = '2019-12-31'
SET @quota_requested = (datediff(dd, @period_from, @period_to) + 1) - (datediff(wk, @period_from, @period_to)*2) - (CASE WHEN datename(dw,@period_from) = 'Sunday' THEN 1 ELSE 0 END) - (CASE WHEN datename(dw, @period_to) = 'Sunday' THEN 1 ELSE 0 END)
SET @balance = (SELECT balance FROM dbo.TABLE_B WHERE holiday = 'Yearly')
SET @quota = (SELECT quota FROM dbo.TABLE_A WHERE holiday = 'Yearly')

IF @balance is null
    SET @balance_new = @quota 
ELSE 
    SET @balance_new = @balance

我在这段代码中所做的是:

当余额 > 0 时,此逻辑非常有效,但当余额变为 0 时,代码的以下部分:

SET @balance = (SELECT balance FROM dbo.TABLE_B WHERE holiday = 'Yearly')

即使余额 = 0,也传递NULL给变量。因此,当余额变为零时,我永远无法停止插入,并且由于这部分代码,代码将余额启动到配额的值:@balance

IF @balance = null or @balance = '' or @balance is null
    SET @balance_new = @quota 
ELSE 
    SET @balance_new = @balance

我真的很想知道这里发生了什么以及为什么 0 被视为NULL. 这可能是由于SET功能?我改变了,SELECT但这并没有改变任何事情。

谢谢

标签: sqlsql-serverstored-procedures

解决方案


水晶球答案

问题是您认为这是不同的价值观0''使用数字数据类型你会错的。试试这个:

SELECT CASE WHEN 0 WHEN '' THEN 0 END;

你得到结果 0 对吗?那是因为''被转换为一个int并且作为一个int值是0

这就是为什么你的IF结果是真的。老实说,我不确定您为什么将 aint与 a进行比较varchar


推荐阅读