如果 1 和 'female' 为 0,我试图用 'male' 表示性别字段的值

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 时转换失败。

Sol*_*zky 7

问题是您有两种不同的返回类型,具体取决于 ; 的值[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”转换为数据类型位时转换失败。

您可以通过NULLELSE条件中返回一个字符串(或文字)来解决此问题(选择这些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].