4

今天我在 SQL 中遇到了一个关于 ISNULL 函数的奇怪问题

我有一个包含客户信息的表,我必须显示一个连接 First、Middle Initial 和 Last Name 的全名,在表中我知道 Middle Initial 是一个可为空的列。

因此,我在 SQL 中使用 ISNULL 函数来返回中间初始值(如果它不为空),这工作正常,但我使用带有如下表达式的 ISNULL 函数,如果 MI 为空,我理想情况下不应该工作,但有趣的是它工作.

SELECT FirstName + ' ' + LastName + ' '+ ISNULL(MI + '.', '') As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

上面的 SOL 查询应该将 MiddleInitial 返回为“。” 当 MiddleInitial 为空时,但它确实返回为空字符串。

所以我写了另一个查询,如下所示。

SELECT (MI + '.') AS MiddleInitial FROM CS_tblMaster WHERE CustomerNo = 2627240

再次给出为 NULL

不知何故,当您将字符串与 NULL 值连接时,它会返回 null。我想了解这个实现。

有人可以帮忙吗

4

6 回答 6

3

如果你想在 MI 为空的情况下加上句号,请使用:(你只是'.'在错误的位置)

SELECT FirstName + ' ' + LastName + ' '+ ISNULL(MI, '.') As MiddleInitial FROM CS_tblMaster WHERE CustomerNo = 2627240
于 2013-07-24T00:16:58.960 回答
1

– 原始声明

SELECT FirstName + ' ' + LastName + ' '+ ISNULL(MI + '.', '') As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

– 我的原始答案(已编辑)

SELECT FirstName + ' ' + LastName + ' '+ (ISNULL(MI, '') + '.') As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

在这种情况下,SQL 将首先检查 MI 是否为 Null,如果 Not Null 则使用 MI,如果是则使用空字符串。然后它将这个结果(现在永远不会为 Null)与句点连接起来。

– 最终答案

SELECT 
    FirstName + ' ' + LastName + ' '
        + CASE WHEN MI IS NULL THEN '' ELSE MI + '.' END As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

@Satish,由于您还没有选择一个,因此不确定您是否觉得自己有答案,如果我的答案简短而快速,我深表歉意。看到所有的回答让我意识到当我第一次看到你的问题时,我并没有考虑太多。

为了回答“我想了解这个实现”,Null 在 SQL 中是一个完全特殊的值。不是空字符串,不是空格,不是零。它们在更字面意义上的意思是“无”。你可以检查它们,看看有没有什么东西空的。但是你不能用 Null 来“做”事情。所以 57 + 空 = 空。'玛丽' + 空 = 空。((12 *37) +568) / 空 = 空。'Albert'、'Mary'、Null 和 'Zeke' 的 Max() 为 Null。这篇文章http://en.wikipedia.org/wiki/Null_(SQL)可能会有所帮助,在 Null Propagation 部分有一个不错的描述。

Isnull 函数与其说是对 Null 的测试,不如说是一种处理它的方法。因此,要测试某些内容是否为 Null,您将在 Select 中使用 ColumnName Is Null 或 ColumnName Is Not Null。Isnull(MI,'') 说的是:我想要一个值,如果 MI 的值不为 null,那么我想要 MI,否则我想要一个空字符串。

继续,我不确定我最初是否理解你实际上想要做什么。如果您想获得中间首字母为空的时间段,那么我的原始答案和其他大多数答案都对您有用。但我想你可能想说:如果我有一个中间名首字母,那么我想要中间名首字母后跟一个句号。如果我没有中间名首字母,那么我什么都不想要:“Alberto C. Santaballa”或“Alberto Santaballa”,从不“Alberto”。圣巴拉”。如果是这种情况,则在编辑后的答案中使用最后的陈述。

@Zec,感谢您的编辑。错字是打字太快的另一个产物!:-/

于 2013-07-24T10:03:00.580 回答
0

NULLIF 怎么样:

SELECT FirstName + ' ' + LastName + ' '+ ISNULL((NULLIF(MI + '.', '.'), '') As MiddleInitial FROM CS_tblMaster WHERE CustomerNo = 2627240

于 2013-08-01T07:37:39.747 回答
0

如果你连接到一个空值,你会得到一个空值。以外面的时期。Isnull(MI, '') + '.'

于 2013-07-24T00:15:15.553 回答
0

兄弟,我猜你误解了 isnull 函数

ISNULL([Columns To Check],[Replaced String]) 

SELECT FirstName + ' ' + LastName + ' '+ ISNULL(MI + '.', '') As MiddleInitial 
FROM CS_tblMaster WHERE CustomerNo = 2627240

ISNULL 函数指的是要检查的列是否为空,然后将其替换为其他一些字符串

在您的查询中,您正在尝试替换您的 MI+'。列到空字符串,希望我的解释可以帮助你=)

于 2013-07-24T01:33:50.153 回答
0

像这样的东西对你有用吗...

    SELECT FirstName + ' ' + LastName + ' '+ CASE WHEN MI is null then '.' else MI END As MiddleInitial 
        FROM CS_tblMaster WHERE CustomerNo = 2627240
END
于 2013-07-24T00:19:00.147 回答