【问题标题】:CASE expression yields error when mixing types混合类型时 CASE 表达式产生错误
【发布时间】:2013-07-08 17:19:45
【问题描述】:

考虑以下几点:

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'。

但考虑一下当DOB = '-' 时正确返回'invalid date'。

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

当DOB = '-' 时,如何让第一条语句返回'invalid date'?

【问题讨论】:

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


    【解决方案1】:

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

    当 DOB = 时,如何让第一条语句返回“无效日期” '-' ?

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

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

    【讨论】:

    【解决方案2】:

    您正在创建一个具有 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

    【讨论】:

      猜你喜欢
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多