Sql SET语句将0视为null
我不知道如何解释我的问题,但我会尽我最大的努力弄清楚 我正在尝试创建一个存储过程,用于处理假期请求。我有两张桌子: 表A包含假日的名称和一年中可请求的最大天数。事情是这样的Sql SET语句将0视为null,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我不知道如何解释我的问题,但我会尽我最大的努力弄清楚 我正在尝试创建一个存储过程,用于处理假期请求。我有两张桌子: 表A包含假日的名称和一年中可请求的最大天数。事情是这样的 TABLE A ------------------------ | HOLIDAY NAME| QUOTA | ------------------------ | Yearly | 40 | ------------------------ 表B跟踪所有假日请求,并自动更新特定假日的剩余天数。在多
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,新假期的请求就不应该通过。为了实现这一点,我应用了以下逻辑(我的程序摘录):
我在这段代码中所做的是:
- 我计算一个人请求的天数(@quota\u requested)
- 我将其与该假期允许的配额(@quota)进行比较
将
传递给变量NULL
,即使余额为0。因此,由于代码的这一部分,当余额为零时,并且代码开始将余额设置为配额值时,我永远无法停止插入:@balance
SET @balance = (SELECT balance FROM dbo.TABLE_B WHERE holiday = 'Yearly')
我很想知道这里发生了什么,以及为什么0被视为IF @balance = null or @balance = '' or @balance is null SET @balance_new = @quota ELSE SET @balance_new = @balance
。这可能是由于设置了NULL
功能造成的吗?我改为
,但这一点没有改变 谢谢水晶球答案 问题是你认为SELECT
和0
是不同的值;对于数字数据类型,您将是错误的。试试这个:'
结果是0,对吗?这是因为SELECT CASE WHEN 0 WHEN '' THEN 0 END;
被转换为'
,作为int
的值是int
这就是为什么您的0
结果为true。我真的不知道你为什么要将IF
与int
进行比较。水晶球答案 问题是你认为varchar
和0
是不同的值;对于数字数据类型,您将是错误的。试试这个:'
结果是0,对吗?这是因为SELECT CASE WHEN 0 WHEN '' THEN 0 END;
被转换为'
,作为int
的值是int
0
这就是为什么您的
结果为true。我真的不知道你为什么要将IF
与int
进行比较。varchar
永远不会起作用;由于其值未知,任何内容都不“等于”NULL。您必须使用@balance=NULL
进行比较。这就是我添加IS(NOT)NULL
的原因。实际上我写的那部分应该去掉。而且,我也不知道你的问题。Mysql和ms sql server是两种不同的rdbms产品,具有不同的sql实现。问题中的代码是针对ms sql server的,而不是针对mysql的。请注意使用合适的标签,否则问题可能会误导回答者。@我已经删除了MySql标签。谢谢大家!@balance IS NULL
永远不会起作用;由于其值未知,任何内容都不“等于”NULL。您必须使用@balance=NULL
进行比较。这就是我添加IS(NOT)NULL
的原因。实际上我写的那部分应该去掉。而且,我也不知道你的问题。Mysql和ms sql server是两种不同的rdbms产品,具有不同的sql实现。问题中的代码是针对ms sql server的,而不是针对mysql的。请注意使用合适的标签,否则问题可能会误导回答者。@我已经删除了MySql标签。非常感谢。如果@balance IS NULL
,则@balance=0
语句的第一行不应为真。我决定使用一种变通方法,将我的IF
语句拆分如下:IF
。这似乎奏效了。但是我仍然不明白为什么第一行是真的,因为如果@balance为null,则设置@balance\u new=@quota如果@balance>=0设置@balance\u new=@balance
和'
有相同的值@BrunoBukavuThai,因为你处理的是整数,而不是字符串。我死了。我又试了一次,但这次通过删除条件0
,整个过程都成功了。我真的不认为@balance='
和'
是一回事。谢谢@larnut如果0
,则这是@balance=0
语句的第一行内容不应为真。我决定使用一种变通方法,将我的IF
语句拆分如下:IF
。这似乎奏效了。但是我仍然不明白为什么第一行是真的,因为如果@balance为null,则设置@balance\u new=@quota如果@balance>=0设置@balance\u new=@balance
和'
有相同的值@BrunoBukavuThai,因为你处理的是整数,而不是字符串。我死了。我又试了一次,但这次通过删除条件0
,整个过程都成功了。我真的不认为@balance='
和'
是一回事。谢谢@Larnu0
IF @balance = null or @balance = '' or @balance is null SET @balance_new = @quota ELSE SET @balance_new = @balance
SELECT CASE WHEN 0 WHEN '' THEN 0 END;