sql - 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
我在这段代码中所做的是:
- 我计算一个人请求的天数(@quota_requested)
我将其与该假期允许的配额进行比较 (@quota)
* If @quota_requested > @quota: Don't proceed * If @quota_requested <= @quota: Proceed to next check
我将请求的天数与该假期的余额进行比较 (@balance)
* If @quota_requested > @balance: Don't proceed * If @quota_requested <= @balance: Insert the request into the table
当余额 > 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
但这并没有改变任何事情。
谢谢
解决方案
水晶球答案
问题是您认为这是不同的价值观0
;''
使用数字数据类型你会错的。试试这个:
SELECT CASE WHEN 0 WHEN '' THEN 0 END;
你得到结果 0 对吗?那是因为''
被转换为一个int
并且作为一个int
值是0
。
这就是为什么你的IF
结果是真的。老实说,我不确定您为什么将 aint
与 a进行比较varchar
。
推荐阅读
- csv - NiFi 使用 MergeRecord 合并 CSV 文件
- javascript - 在 Outlook WebAddin 中获取邮件项目主题时出错
- loops - ansible 模板循环 jinja2 “我需要用 分隔的行,但最后一个条目没有,
- sass - 为什么 SCSS 在 atom 中编译错误?
- javascript - 从 javascript 客户端调用 javascript 适配器得到 415 Unsupported Media Type 响应
- docker - 如何在 if 语句中更改 docker ARG 值?
- angular - 调用 HTTP.post() 角度时表单数据为空
- java - 如何使用 Olingo v2 和 Java 发出 $batch POST 请求
- apache-camel - Camel JPA 组件路由未完全执行
- r - 如何在 R Markdown 中水平绘制决策树?