Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql SET语句将0视为null_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql SET语句将0视为null

Sql SET语句将0视为null,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我不知道如何解释我的问题,但我会尽我最大的努力弄清楚 我正在尝试创建一个存储过程,用于处理假期请求。我有两张桌子: 表A包含假日的名称和一年中可请求的最大天数。事情是这样的 TABLE A ------------------------ | HOLIDAY NAME| QUOTA | ------------------------ | Yearly | 40 | ------------------------ 表B跟踪所有假日请求,并自动更新特定假日的剩余天数。在多

我不知道如何解释我的问题,但我会尽我最大的努力弄清楚

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

表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,新假期的请求就不应该通过。为了实现这一点,我应用了以下逻辑(我的程序摘录):

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

  • 我计算一个人请求的天数(@quota\u requested)
  • 我将其与该假期允许的配额(@quota)进行比较

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

    SET @balance = (SELECT balance FROM dbo.TABLE_B WHERE holiday = 'Yearly')
    
    IF @balance = null or @balance = '' or @balance is null
        SET @balance_new = @quota 
    ELSE 
        SET @balance_new = @balance
    
    我很想知道这里发生了什么,以及为什么0被视为
    NULL
    。这可能是由于设置了
    功能造成的吗?我改为
    SELECT
    ,但这一点没有改变

    谢谢

    水晶球答案

    问题是你认为
    0
    '
    是不同的值;对于数字数据类型,您将是错误的。试试这个:

    SELECT CASE WHEN 0 WHEN '' THEN 0 END;
    
    结果是0,对吗?这是因为
    '
    被转换为
    int
    ,作为
    int
    的值是
    0

    这就是为什么您的
    IF
    结果为true。我真的不知道你为什么要将
    int
    varchar
    进行比较。

    水晶球答案

    问题是你认为
    0
    '
    是不同的值;对于数字数据类型,您将是错误的。试试这个:

    SELECT CASE WHEN 0 WHEN '' THEN 0 END;
    
    结果是0,对吗?这是因为
    '
    被转换为
    int
    ,作为
    int
    的值是
    0


    这就是为什么您的
    IF
    结果为true。我真的不知道你为什么要将
    int
    varchar
    进行比较。

    @balance=NULL
    永远不会起作用;由于其值未知,任何内容都不“等于”NULL。您必须使用
    IS(NOT)NULL
    进行比较。这就是我添加
    @balance IS NULL
    的原因。实际上我写的那部分应该去掉。而且,我也不知道你的问题。Mysql和ms sql server是两种不同的rdbms产品,具有不同的sql实现。问题中的代码是针对ms sql server的,而不是针对mysql的。请注意使用合适的标签,否则问题可能会误导回答者。@我已经删除了MySql标签。谢谢大家!
    @balance=NULL
    永远不会起作用;由于其值未知,任何内容都不“等于”NULL。您必须使用
    IS(NOT)NULL
    进行比较。这就是我添加
    @balance IS NULL
    的原因。实际上我写的那部分应该去掉。而且,我也不知道你的问题。Mysql和ms sql server是两种不同的rdbms产品,具有不同的sql实现。问题中的代码是针对ms sql server的,而不是针对mysql的。请注意使用合适的标签,否则问题可能会误导回答者。@我已经删除了MySql标签。非常感谢。如果
    @balance=0
    ,则
    IF
    语句的第一行不应为真。我决定使用一种变通方法,将我的
    IF
    语句拆分如下:
    如果@balance为null,则设置@balance\u new=@quota如果@balance>=0设置@balance\u new=@balance
    。这似乎奏效了。但是我仍然不明白为什么第一行是真的,因为
    '
    0
    有相同的值@BrunoBukavuThai,因为你处理的是整数,而不是字符串。我死了。我又试了一次,但这次通过删除条件
    @balance='
    ,整个过程都成功了。我真的不认为
    '
    0
    是一回事。谢谢@larnut如果
    @balance=0
    ,则这是
    IF
    语句的第一行内容不应为真。我决定使用一种变通方法,将我的
    IF
    语句拆分如下:
    如果@balance为null,则设置@balance\u new=@quota如果@balance>=0设置@balance\u new=@balance
    。这似乎奏效了。但是我仍然不明白为什么第一行是真的,因为
    '
    0
    有相同的值@BrunoBukavuThai,因为你处理的是整数,而不是字符串。我死了。我又试了一次,但这次通过删除条件
    @balance='
    ,整个过程都成功了。我真的不认为
    '
    0
    是一回事。谢谢@Larnu
    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;