1

我正在使用 Transact-SQL 开发 Microsoft SQL Server 2005。

我正在尝试连接来自处理 NULL 值的同一表的不同列的字符串值。

例如,表是,Person列是FirstName,,SurnamePrefixLegalSurname

碰巧将字符串值与 NULL 值(来自两个不同的列)连接会在输出中返回 NULL 值。我尝试了不同的方案来防止输出中出现 NULL 值:

  • 从...开始:
    • Person.FirstName + ' ' + COALESCE(RTRIM(LTRIM(Person.SurnamePrefix)) + ' ', '') + Person.LegalSurname
  • 我将我的声明更改为:
    • COALESCE(Person.FirstName + ' ', '') + COALESCE(Person.SurnamePrefix, '') + COALESCE(' ' + Person.LegalSurname, '')

然后我遇到了诸如ISNULL()等之类的功能NULLIF()

在输出中显示空字符串值而不是 NULL 值的最佳和有效方法是什么?解决方案是否受 SQL Server 版本的影响?(即 2005 年、2008 年等)

4

3 回答 3

2

ISNULL正如您所做的那样,它适用于默认值。 COALESCE具有接受两个以上论点的优势。 NULLIF完全不同,因为它返回 aNULL如果参数相等。

您可以对它们进行性能基准测试。我怀疑差异可以忽略不计,选择清晰的代码更为重要。

于 2012-08-09T12:34:04.433 回答
1

这不是您问题的直接答案,但尽管在 SQL Server 的未来版本中已弃用它,但 SQL 2005 允许您CONCAT_NULL_YIELDS_NULL在连接级别启动。(也可以使用ALTER DATABASE命令在数据库级别设置它,但这可能会影响现有查询的行为)。您可以在运行查询之前设置它:

SET CONCAT_NULL_YIELDS_NULL OFF

SELECT 'a' + NULL

产生结果

a

从可维护性的角度来看,最好避免这样做——它会使粗心的人感到困惑——但它是你现在正在做的另一种选择。

于 2012-08-09T12:40:18.767 回答
1

Aaron Bertrand进行了比较 COALESCEISNULL发现两者之间没有显着的性能差异。

于 2012-08-09T16:45:50.663 回答