NULLIF返回现有值的第一个字符,而不是整个值

时间:2019-03-11 04:27:14

标签: sql sql-server

据我了解,在以下查询中,如果NULLIF中的第一个值为空字符串,则应保留现有列的值。在我的实际查询中,这些是变量,但是我在查询中放置了实际值以使其更短。

ISNULL(NULLIF(N'', N''), Pwd) => ISNULL(NULL, Pwd) => Pwd

相反,正在发生的是将第一个字符设置为值。在下面运行查询,并注意Pwd的值。

DECLARE @tblHello TABLE (
    UserID INT NOT NULL IDENTITY(1,1),
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    CompanyName VARCHAR(80),
    Pwd VARCHAR(100) NOT NULL,  
    Email VARCHAR(100) NOT NULL,
    CreatedDate DATE NOT NULL DEFAULT SYSUTCDATETIME(),
    LastUpdated DATE NOT NULL DEFAULT SYSUTCDATETIME(), 
    isActive BIT NOT NULL DEFAULT(1)
)

INSERT INTO @tblHello (FirstName, LastName, CompanyName, Pwd, Email)
VALUES ('First', 'Last', 'Testing this', 'This is the password', 'test@email.com')

UPDATE @tblHello
SET
    Email = ISNULL(NULLIF(N'testuser58@email.com', ''), Email),
    FirstName = ISNULL(NULLIF(N'Updated', ''), FirstName),
    Pwd = ISNULL(NULLIF(N'', N''), Pwd),
    LastName = ISNULL(NULLIF(N'YmFaADIDaQVauHF', ''), LastName),
    isActive = ISNULL(NULLIF(1, ''), isActive),
    CompanyName = ISNULL(NULLIF(N'Testing Co', ''), CompanyName)
WHERE UserID = 1

SELECT *
FROM @tblHello

对于Pwd,我得到以下结果:(省略了其余的列)

Pwd CompanyName Email
T   Testing Co  testuser58@email.com

无论是否带有前置的“ N”,都会发生这种情况。为什么会这样?

3 个答案:

答案 0 :(得分:4)

ISNULL()将替换值转换为校验表达式的类型。您的情况默认为​​CHAR(1)

根据 MSDN

  

如果check_expression的值不为NULL,则返回该值;   否则,则隐式返回replacement_value   如果类型不同,则转换为check_expression的类型。   如果replace_value的长度大于   check_expression。

ISNULL (Transact-SQL)

您应该使用COALESCE()而不是ISNULL()来避免任何截断。

答案 1 :(得分:1)

我用以下代码替换了您的代码行,它有效

 Pwd = ISNULL(CAST(NULLIF(N'', N'') AS varchar(50)), Pwd),

这应该是由于NULLIF()函数返回的数据类型而发生的。无论如何,谢谢您的问题,找到了新的东西。

答案 2 :(得分:1)

这只是数据类型的问题。您正在使用

<div class="card-box">
  <div class="card">
    <div class="front">
      Front
    </div>
    <div class="back">
      Back
    </div>
  </div>

此处ISNULL(NULLIF(N'', N''), 'Ravi') 的长度为1,因此只需将N''投射为所需的N''长度,您将获得正确的输出

尝试

nvarchar