ISNULL(),NULLIF()和COALESCE()背后的威胁/缺点

时间:2012-08-09 11:57:27

标签: tsql sql-server-2005 null concatenation

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

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

例如,表格为Person,列为FirstNameSurnamePrefixLegalSurname

碰巧将字符串值与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年等)

3 个答案:

答案 0 :(得分:2)

正如您所做的那样,

ISNULL适用于默认值。 COALESCE的优点是可以接受两个以上的参数。 NULLIF非常不同,因为如果参数相等,它会返回NULL

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

答案 1 :(得分:1)

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

SET CONCAT_NULL_YIELDS_NULL OFF

SELECT 'a' + NULL

产生结果

a

从可维护性的角度来看,避免这样做可能会更好 - 它会让粗心大意迷惑 - 但它是你现在正在做的另一种选择。

答案 2 :(得分:1)

Aaron Bertrand compared COALESCE ISNULL,发现两者之间没有明显的性能差异。