将NULL转换为空字符串 - 将字符转换为唯一标识符时转换失败

33

在使用SQL Server 2005中,我如何获得以下语句或者说让输出符合我的要求。

SELECT Id   'PatientId',
       ISNULL(ParentId,'')  'ParentId'
FROM Patients

ParentId是一个允许NULLuniqueidentifier,但似乎查询优化器还尝试将''转换回uniqueidentifier,用于那些ParentId = NULL的行。正如标题所述,这就是查询运行程序抛出的确切错误信息!

  • 如何让服务器返回空字符串以表示ParentId = NULL
4个回答

72
SELECT Id   'PatientId',
       ISNULL(CONVERT(varchar(50),ParentId),'')  'ParentId'
FROM Patients

ISNULL函数总是试图返回一个与其第一个参数相同数据类型的结果。因此,如果你想得到一个字符串 (varchar) 的结果,最好确保第一个参数的类型为字符串。


COALESCE函数通常比ISNULL更好用,因为它考虑了所有参数的数据类型,并应用适当的优先级规则来确定最终结果的数据类型。不幸的是,在这种情况下,uniqueidentifier的优先级高于varchar,所以这并没有帮助。

(它也通常更受欢迎,因为它可以扩展到超过两个参数)


谢谢您提供的超出预期的帮助。我从您的回答中学到了更多。我将在4分钟内标记为已解决。问候。 - Deeptechtons
@Damien_The_Unbeliever 我尝试了 'COALESCE(CONVERT(varchar(50),ParentId),'')' 和 'ISSNULL(CONVERT(varchar(50),ParentId),'')',但仍然得到零而不是空单元格。我的 ParentId 是 smallint 类型。 - theteague
还尝试了ISNULL(CAST(ParentId as VARCHAR(50)),'')和COALESCE(CAST(ParentId as VARCHAR(50)),'')。 - theteague
@bteague - COALESCEISNULL用于处理空值,而不是零值。如果您想让零值变为空字符串,那么您可能正在寻找一个CASE表达式。但请记住,如果您希望一个结果是空字符串,您需要确保CASE的所有可能结果也是字符串。(例如,一个int类型是不能包含空字符串的) - Damien_The_Unbeliever
@Damien_The_Unbeliever 我的数据点是smallint类型,当我尝试将null转换为空字符串时,我得到了一个零,而我不想要零。ISNULL(CONVERT(varchar(50),ParentID),'') 是正确的。我的查询由三个查询组成,通过union all连接在一起,我只在第一个代码块中转换了这个字段。最终结果是零。由于第一个代码块的格式通常会(我认为)贯穿查询中该列的其余部分,所以我期望它会抛出错误而不是忽略我的varchar转换。感谢您的时间。 - theteague

9
Select ID, IsNull(Cast(ParentID as varchar(max)),'') from Patients

这是必要的,因为ParentID字段不是varchar/nvarchar类型。以下代码可以解决问题:

Select ID, IsNull(ParentID,'') from Patients

8

您需要将ParentId转换为nvarchar,以便输出始终是相同的数据类型。

SELECT Id   'PatientId',
       ISNULL(CAST(ParentId as nvarchar(100)),'')  'ParentId'
FROM Patients

0

从 Sql Server 2012 开始: 字符串拼接函数 CONCAT 隐式转换为字符串。因此,另一个选项是

SELECT Id AS 'PatientId',
       CONCAT(ParentId,'') AS 'ParentId'
FROM Patients

CONCAT函数将null值转换为空字符串。

有些人认为这是一种hacky的做法,因为它仅仅利用了一个函数的副作用,而该函数本身并不是完成手头任务所必需的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接