以下查询返回上述错误。 WNT.USER.PriviligeLevel_SV列包含值1,2,3或不同的错误。如果值为1,我需要让查询返回'Administrator',如果值为2则返回'Guest',如果值为3,则返回'User'。否则此列应包含逐字错误消息。我曾尝试使用ELSE CAST([Wnt.User.PrivilegeLevel_SV] AS nvarchar)
和WHEN [Wnt.User.PrivilegeLevel_SV] NOT LIKE '%[^0-9]%'
,但两者都没有效果。请指教。
SELECT [Wnt.User.Host] AS 'Machine Name',
"Account Privilege Level" =
CASE
When [Wnt.User.PrivilegeLevel_SV] = 1 Then 'Administrator'
When [Wnt.User.PrivilegeLevel_SV] = 2 Then 'User'
When [Wnt.User.PrivilegeLevel_SV] = 3 Then 'Guest'
Else [Wnt.User.PrivilegeLevel_SV]
End
FROM [Prod].[AdHoc].[TestBuffer]
SQL版本是2008,WNT.USER.PriviligeLevel_SV列定义为nvarchar(max)
答案 0 :(得分:2)
SQL Server中同一CASE
的不同分支返回的数据类型不同。 (即使分支不会被执行也是如此)
由于SQL Server的data type precedence规则,VARCHAR
值被强制导入INT
失败。
您应该将值从Else
- 分支转换为NVARCHAR
(或VARCHAR
),以使CASE
的所有分支返回相同的数据类型。
即。例如Else CAST([Wnt.User.PrivilegeLevel_SV] AS NVARCHAR(MAX))
。
答案 1 :(得分:0)
实际上这很简单:
SELECT [Wnt.User.Host] AS 'Machine Name',
"Account Privilege Level" =
CASE
When [Wnt.User.PrivilegeLevel_SV] = '1' Then 'Administrator'
When [Wnt.User.PrivilegeLevel_SV] = '2' Then 'User'
When [Wnt.User.PrivilegeLevel_SV] = '3' Then 'Guest'
Else [Wnt.User.PrivilegeLevel_SV]
End
FROM [Prod].[AdHoc].[TestBuffer]
如果列类型为varchar,则需要确保将数字用单引号括起来。