use*_*236 3 sql-server sql-server-2012
需要转换的性别字段的数据类型为位。
我使用了这个语法:
Select case when CAST([GenderIsMale] AS bit)=1 then 'Male'
when CAST([GenderIsMale] AS bit)=0 then 'Female'
else CAST([GenderIsMale] AS bit)
end
Run Code Online (Sandbox Code Playgroud)
返回错误:
将 varchar 值 'Male' 转换为数据类型 bit 时转换失败。
问题是您有两种不同的返回类型,具体取决于 ; 的值[GenderIsMale]。这两个WHEN条件返回一个字符串,而ELSE返回一个BIT. 更容易查看您是否很好地格式化代码:
Select case
when CAST([GenderIsMale] AS bit)=1 then 'Male' -- return type = VARCHAR
when CAST([GenderIsMale] AS bit)=0 then 'Female' -- return type = VARCHAR
else CAST([GenderIsMale] AS bit) -- return type = BIT
end
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式进行测试:
DECLARE @GenderIsMale INT = 1;
Select case
when CAST(@GenderIsMale AS bit)=1 then 'Male'
when CAST(@GenderIsMale AS bit)=0 then 'Female'
else CAST(@GenderIsMale AS bit)
end
Run Code Online (Sandbox Code Playgroud)
返回:
消息 245,级别 16,状态 1,第 28
行在将 varchar 值“Male”转换为数据类型位时转换失败。
您可以通过NULL在ELSE条件中返回一个字符串(或文字)来解决此问题(选择这些ELSE条件之一,具体取决于您要完成的任务):
SELECT CASE CAST([GenderIsMale] AS BIT)
WHEN 1 THEN 'Male'
WHEN 0 THEN 'Female'
ELSE 'other string'
--ELSE CONVERT(VARCHAR(50), [GenderIsMale]) -- if column is a numeric type
--ELSE [GenderIsMale] -- if column is a string type
--ELSE NULL
END;
Run Code Online (Sandbox Code Playgroud)
请注意:
根据GenderIsMale列的数据类型和其中的数据,可能还有一个额外的错误来源:CAST值的in BIT。例如,如果数据类型是VARCHAR,则空字符串、'true'、'false'和仅数字 0 - 9(没有空格、逗号、句点或减号)的字符串的值将转换,但其他任何内容都会出错。由于您使用的是 SQL Server 2012,您可以切换到使用TRY_CAST(甚至TRY_CONVERT)来解决这个问题。
注释掉的ELSE条件主要是为了显示使结果表达式在CASE语句的所有分支中保持一致的可能变化。但是在这里有一个BIT/ 布尔值的场景中,如果GenderIsMale列的数据类型是数字,那么唯一可能落入ELSEa 的值是 a NULL,因此您将使用ELSE NULL. 但如果数据类型是字符串,那么您将使用ELSE [GenderIsMale].