我正在使用Transact-SQL开发Microsoft SQL Server 2005。
我正在尝试连接来自同一个表的不同列的字符串值,处理NULL值。
例如,表格为Person
,列为FirstName
,SurnamePrefix
,LegalSurname
碰巧将字符串值与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年等)
答案 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
,发现两者之间没有明显的性能差异。