使用SQL Server 2005如何获得以下语句,或者更确切地说是我想要的输出。
SELECT Id 'PatientId',
ISNULL(ParentId,'') 'ParentId'
FROM Patients
ParenId是允许uniqueidentifier
的{{1}},但似乎查询优化器会尝试将NULL
转换回''
以查找uniqueidentifier
行。正如标题所说,这是查询运行员抛出的确切错误信息!!
ParentId = NULL
答案 0 :(得分:63)
SELECT Id 'PatientId',
ISNULL(CONVERT(varchar(50),ParentId),'') 'ParentId'
FROM Patients
ISNULL
总是尝试返回与其第一个参数的类型具有相同数据类型的结果。所以,如果你想让结果成为一个字符串(varchar
),你最好确保它是第一个参数的类型。
COALESCE
通常比ISNULL
更好用,因为它会考虑所有参数数据类型并应用适当的precedence规则来确定最终结果数据类型。不幸的是,在这种情况下,uniqueidentifier
的优先级高于varchar
,因此无效。
(它通常也是首选,因为它扩展到两个以上的参数)
答案 1 :(得分:8)
Select ID, IsNull(Cast(ParentID as varchar(max)),'') from Patients
这是必需的,因为字段ParentID不是varchar / nvarchar类型。这样就可以了:
Select ID, IsNull(ParentID,'') from Patients
答案 2 :(得分:6)
您需要CAST
ParentId
作为nvarchar
,以便输出始终是相同的数据类型。
SELECT Id 'PatientId',
ISNULL(CAST(ParentId as nvarchar(100)),'') 'ParentId'
FROM Patients
答案 3 :(得分:0)
从Sql Server 2012开始:字符串串联函数CONCAT
隐式转换为字符串。因此,另一种选择是
SELECT Id AS 'PatientId',
CONCAT(ParentId,'') AS 'ParentId'
FROM Patients
CONCAT
将null
的值转换为空字符串。
有些人会认为这很棘手,因为它只是利用了函数的副作用,而手本身的任务不需要该函数本身。