【问题标题】:Using ISNULL when adding NULL to varchar将 NULL 添加到 varchar 时使用 ISNULL
【发布时间】:2021-12-28 10:41:54
【问题描述】:

在尝试使用 MSSQL 时,我遇到了一些我无法解释的行为。

我正在研究将 NULL 值添加到 varchar 以及执行以下查询时会发生什么情况:

SELECT
   ISNULL(NULL + ' ', 'test')

我得到结果'te'。同样,如果我将单词 test 更改为任何其他单词,我只会得到前两个字母。如果我增加 + ' ' 中的空格数,我会在结果中得到额外的字母(所以 NULL + '[两个空格]' 给我 'tes')。有什么想法吗?

如果我声明一个变量并将其设置为 NULL,例如

DECLARE @testnull AS varchar(32)

SET @testnull = NULL

SELECT
ISNULL(@testnull + ' ', 'test')

然后我得到结果“测试”(如我所料)。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用COALESCEISNULL 采用 first NON-NULL 数据类型,在这种情况下,因为它没有被声明,你会得到一个 VARCHAR(1)NULL 然后它变成一个 VARCHAR(2)当您添加空间时(在评估时这仍然是NULL,但 SQL Server 在该步骤之前做出了假设)。在某些情况下,不带长度的varchar 的默认值为 1,而在其他情况下,默认值为 30。我会让你猜猜这里使用的是哪一个。

    SELECT
     ISNULL(NULL + ' ', 'test'), COALESCE(NULL + ' ', 'test');
    

    结果:

    ----  ----
    te    test
    

    您可以通过以下方式明确看到这一点:

    SELECT
       x = ISNULL(NULL + ' ', 'test')
       INTO #a1;
    
    SELECT
       x = COALESCE(NULL + ' ', 'test')
       INTO #a2;
    
    SELECT LEFT(t.name, 3), TYPE_NAME(c.user_type_id), max_length
    FROM tempdb.sys.columns AS c
      INNER JOIN tempdb.sys.tables AS t
      ON c.[object_id] = t.[object_id]
      WHERE t.name LIKE '#a[1-2]%';
    

    结果:

    ---  -------  ----
    #a1  varchar     2
    #a2  varchar     4
    

    在几乎所有情况下,我更喜欢COALESCE 而不是ISNULL。我在本技巧中解释了原因(以及存在异常的位置):

    【讨论】:

    • varchar(1) 怎么会得到'te'
    • @Kaf 添加' '时变为varchar(2)。
    • 我的朋友,你不会停止在这个领域让我感到惊讶,+1 以获得精彩的答案!
    • 很好的答案,也是非常有用的文章。谢谢!
    • 我可以看到here 发生的模式,但它提供了null + null 的完整字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多