我正在使用Adventureworks2008R2数据库并尝试呈现以下内容。 我在SQL查询中遇到了Case子句的问题。
表中的Enddate是date数据类型
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不为null时,用“仍在工作”字符串替换该列。
答案 0 :(得分:4)
在CAST
列周围放置一个EndDate
可以帮助您。我认为CASE
语句正在定义具有string
数据类型的列。
CASE
WHEN (EndDate IS NULL) THEN 'Still working'
ELSE CAST(EndDate AS VARCHAR)
END
答案 1 :(得分:1)
FWIW,这是适用的CASE文档:
input_expression和每个when_expression的数据类型必须相同或必须是隐式转换... [还有] else_result_expression的数据类型,任何result_expression必须相同或必须是隐式转换< /强>
应答:
为什么我应该将它转换为Varchar,因为我没有将数据存储在数据库中,Select应该渲染它吗?
这是一个要求(CASE具有 fixed 结果类型)的原因是结果集中的每个记录(元组)必须具有相同的类型。如其他答案中所指出的,明确的强制到VARCHAR,将数据“扩展”为一种普通类型。
结果集的模式与结果集本身的数据是分开的,并且(至少在非OORDMBS中)是invariant(CASE
语句本身通过隐式转换是逆变的) - 这就是“只是SQL工作的方式”,并且结果集是否被送入另一个选择/加入或返回给客户端并不重要。 “客户端”很可能是运行远程查询的另一台服务器; - )
想象一下这个无效的结果集(这是SQL Server拒绝的):
schema: {int, date}
{1: int, 2001.10.22: date}
{2: int, "Hello world": string} <-- misshaped record! must agree with schema!
快乐的编码。
答案 2 :(得分:0)