Sql server 如何在SQL Server中将varchar零长度视为null?

Sql server 如何在SQL Server中将varchar零长度视为null?,sql-server,null,Sql Server,Null,我知道在SQL Server中,零长度字符串(“”)不同于null,但是有没有办法确定它是零长度字符串还是null 业务要求是: 如果用户输入一个索引词,比如说在日期中输入,然后在日期中匹配 如果用户在_DATE中未为输入任何内容,则匹配所有内容 我使用以下语句进行了测试 DECLARE @IN_DATE VARCHAR(8) SET @IN_DATE = null --SET @IN_DATE = '' SELECT CONVERT(VARCHAR(8), ISNULL(@IN_

我知道在SQL Server中,零长度字符串(“”)不同于
null
,但是有没有办法确定它是零长度字符串还是null

业务要求是:

  • 如果用户输入一个索引词,比如说在日期中输入
    ,然后在日期中匹配

  • 如果用户在_DATE中未为
    输入任何内容,则匹配所有内容

  • 我使用以下语句进行了测试

    DECLARE @IN_DATE VARCHAR(8)
    SET @IN_DATE  = null
    --SET @IN_DATE  = ''
    SELECT 
        CONVERT(VARCHAR(8), ISNULL(@IN_DATE, GETDATE()), 112) AS OUT_DATE
    
    null或zero length
    VARCHAR
    都不会给我带来预期的结果。但我尝试了以下正确的查询

    SELECT 
        CONVERT(VARCHAR(8), ISNULL(NULL, GETDATE()), 112) AS OUT_DATE
    

    任何人都可以告诉我这些查询的内在逻辑是什么?非常感谢。

    如果变量为
    NULL
    或空,则默认为今天

    DECLARE @IN_DATE VARCHAR(8) = ''
    SELECT  
        (CASE @IN_DATE WHEN '' 
                      THEN CONVERT(VARCHAR(100), GETDATE(), 112) 
                      ELSE @IN_DATE END) AS OUT_DATE
    
    SELECT ISNULL(NULLIF(@IN_DATE, ''), GETDATE())
    
    对于(2)而言,如果用户未为输入日期输入任何内容,则匹配所有内容


    如果变量为
    NULL
    或空,则默认为今天

    SELECT ISNULL(NULLIF(@IN_DATE, ''), GETDATE())
    
    对于(2)而言,如果用户未为输入日期输入任何内容,则匹配所有内容

    1) 如果NULL用于passed,则返回今天的日期

    2) 如果文本“13/13/2014”已通过,但不是有效日期,则今天的日期再次通过

    3) 如果传递了有效日期“2014年3月13日”,则会将其转换为有效日期类型

    1) 如果NULL用于passed,则返回今天的日期

    2) 如果文本“13/13/2014”已通过,但不是有效日期,则今天的日期再次通过


    3) 如果传递了有效日期“2014年3月13日”,它将转换为有效的日期类型

    您可以使用此查询来处理此情况。为什么在
    NULL
    上调用
    ISNULL()
    ?您可以使用此查询来处理此情况。为什么在
    NULL
    上调用
    ISNULL()
    ?您的区别是什么(至少将@IN_DATE设置为null)来自ISNULL函数的使用。如果改用COALESCE,则会得到相同的结果(对于null值):有关解释,请参阅。可能用户没有直接在SQL查询窗口中键入文本-希望用户和SQL Server之间有一些代码-最好在该层中执行适当的解析/错误更正,然后传递真正的
    datetime
    (或
    date
    datetime2
    ,视情况而定)而不是将这个模糊的字符串传递给服务器。@RaphaëlAlthaus谢谢。我阅读了参考资料,发现它非常有用。@Damien_不相信你是对的。操作层将首先从视图层接收参数。但是对于我要求的情况,我必须编写一个查询来处理NULL或“”参数,因为som没有人会重复使用查询,不幸的是,我不能假设他会发送完美的参数。但是使用
    datetime
    而不是字符串是确保他们发送正确参数的更好方法-你突然免费地还可以保证他们发送给你的是有效的日期,而不是字符串
    last monday
    (或
    2014-02-30
    )。接受数据类型,你就不那么愚蠢了,你需要找到解决办法。你的差异(至少@IN_DATE设置为null)来自于使用ISNULL函数。如果你改用COALESCE,你会得到相同的结果(对于null值):有关解释,请参阅。可能用户没有直接在SQL查询窗口中键入文本-希望用户和SQL Server之间有一些代码-最好在该层中执行适当的解析/错误更正,然后传递真正的
    datetime
    (或
    date
    datetime2
    ,视情况而定)而不是将这个模糊的字符串传递给服务器。@RaphaëlAlthaus谢谢。我阅读了参考资料,发现它非常有用。@Damien_不相信你是对的。操作层将首先从视图层接收参数。但是对于我要求的情况,我必须编写一个查询来处理NULL或“”参数,因为som没有人会重复使用查询,不幸的是,我不能假设他会发送完美的参数。但是使用
    datetime
    而不是字符串是确保他们发送正确参数的更好方法-你突然免费地还可以保证他们发送给你的是有效的日期,而不是字符串
    上周一
    (或
    2014-02-30
    )。接受数据类型,你就不会那么愚蠢了,然后你就可以找到解决办法了。感谢回复。我尝试了解决方案。第一种方法似乎无法工作,因为ISNULL()将始终返回与其第一个参数相同的数据类型。结果非常奇怪:“10 27 20”。与(2)一样您提到过,我想它会对我有所帮助,非常感谢。但是当IN_DATE设置为null时,NULLIF会抛出一个异常“必须指定第一个参数的日期类型”。感谢您的回复。我尝试了解决方案。第一个方法似乎无法工作,因为ISNULL()将始终返回与其第一个参数相同的数据类型。结果非常奇怪:“10 27 20”。与(2)一样您提到过,我想这会对我有所帮助,非常感谢。但当IN_DATE设置为null时,NULLIF会抛出一个异常“必须指定第一个参数的日期类型”。非常感谢。您的回答启发了我,我在LEN(@input)时使用CASE当@input不是日期格式时,一次识别空字符串和零长度字符串。非常感谢。您的回答启发了我,我使用了CASE when(@input)在@input不是日期格式时一次识别空字符串和零长度字符串。
    DECLARE @PASSED AS VARCHAR(50) = NULL
    
    SELECT 
      CASE 
         WHEN ISDATE(@PASSED) = 0 THEN GETDATE() 
         ELSE CONVERT(DATE, @PASSED) 
      END AS DATE_OUT