混合类型时,CASE表达式会产生错误

时间:2013-07-08 17:19:45

标签: sql-server sql-server-2005 case

请考虑以下事项:

SELECT [DOB] = CASE WHEN [DOB] = '-' then 'invalid date' ELSE cast([DOB] as datetime) 
END
FROM myTable where myID = 73351

DOB = '-'时,收到错误消息:

  

从字符串转换日期时转换失败。

这似乎表明SQL Server尝试将DOB强制转换为datetime,尽管它应该只打印'invalid date'

但请考虑在'invalid date'时正确返回DOB = '-'

SELECT [DOB] = CASE WHEN [DOB] = '-' then 'invalid date' ELSE 'valid date'
END
FROM myTable where myID = 73351

如何在'invalid date'

时获得第一个返回DOB = '-'的语句?

2 个答案:

答案 0 :(得分:2)

case表达式只会产生一种数据类型。您不能拥有不同行的不同数据类型。查询中的数据类型为datetimeinvalid date是无效的日期时间值。

  

当DOB =时,如何获得第一个返回'无效日期'的语句   ' - '?

唯一的方法是不将值转换为datetime

CASE WHEN [DOB] = '-' then 'invalid date' ELSE [DOB] END

答案 1 :(得分:1)

您正在创建一个包含2种不同数据类型的列:varchar和datetime。尝试将两种可能性都转换为SQL_VARIANT。

SELECT [DOB] =
CASE
    WHEN [DOB] = '-' THEN CAST('Invalid' as sql_variant)
    ELSE CAST(CAST([DOB] as DATETIME) as sql_variant)
END

http://msdn.microsoft.com/en-us/library/ms173829(v=sql.90).aspx