1

我正在使用 Adventureworks2008R2 数据库并尝试呈现以下内容。我对 SQL 查询中的 Case 子句有疑问。

表中的 Enddate 是日期数据类型

SELECT  
         Firstname,
            Lastname, 
            Startdate,
            'END DATE' =
              CASE   
                WHEN (ENDDATE is  null) Then 'Still Working'
                ELSE EndDate
               END
FROM 
     DIMEMPLOYEE

这是我得到的错误。

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

我知道它为什么会来,但不知道容易解决吗? 更新:

我想要的是当 endate 不为空时,用“仍在工作”字符串替换该列。

4

3 回答 3

4

CAST会在柱子周围放置一个EndDate帮助你的地方。我认为该CASE语句正在定义具有string数据类型的列。

CASE
WHEN (EndDate IS NULL) THEN 'Still working'
ELSE CAST(EndDate AS VARCHAR)
END
于 2011-10-22T20:00:14.043 回答
1

FWIW,这是适用的CASE文档:

input_expression 和每个 when_expression 的数据类型必须相同或必须是隐式转换... [还有] else_result_expression 和任何 result_expression 的数据类型必须相同或必须是隐式转换


回答:

为什么我应该将它转换为 Varchar,因为我没有将数据存储在数据库中,选择应该呈现它?

这是一个要求(CASE 具有固定的结果类型)的原因是结果集中的每个记录(元组)必须具有相同的类型。正如其他答案中所指出的,对 VARCHAR的显式强制将数据“扩大”为一种通用类型。

结果集的模式与结果集本身的数据是分开的,并且(至少在非 OORDMBS 中)是不变的(CASE语句本身通过隐式转换是逆变的)——这就是“SQL 的工作方式”,并且结果集是否被送入另一个选择/加入或返回给客户端都没有关系。“客户端”很可能是另一台运行远程查询的服务器;-)

想象一下这个无效的结果集(这是 SQL Server 拒绝的):

schema: {int, date}
{1: int, 2001.10.22: date}
{2: int, "Hello world": string} <-- misshaped record! must agree with schema!

快乐编码。

于 2011-10-22T20:18:15.147 回答
0

您也可以使用合并

     Coalesc(cast(enddate as varchar), 'still working')
于 2011-10-22T20:05:31.450 回答