我有以下案例陈述,但我想补充案例陈述,其中END_DT是1/1/3000归类为开放。
CASE WHEN x.END_dt IS NOT NULL OR REASON IS NOT NULL
THEN 'Closed' ELSE 'Open' END AS Enrolled
我得到以下结果,但在这种情况下,这应该在登记栏下归类为未结
我已尝试添加案例数据但我收到错误。
一个 - 不一致的数据类型;预计日期得到的数字 二 - 在日期中添加“1/1/3000” - 不是有效月份。
帮助将不胜感激。
表
id End_dt Reason Enrolled
1 1/1/3000 Closed
答案 0 :(得分:1)
感谢mathguy提醒我有关ANSI标准日期格式的信息。我改变了我的例子,假设x.END_dt是DATE数据类型:
CASE
WHEN x.END_dt = date '3000-01-01'
THEN 'Open'
WHEN x.END_dt IS NULL AND REASON IS NULL
THEN 'Open'
WHEN x.END_dt IS NOT NULL OR REASON IS NOT NULL
THEN 'Closed'
ELSE 'Unexpected x.END_dt value: ' || to_char(x.END_dt)
END AS Enrolled
我还收紧了case语句来处理意外的END_dt值并在他们自己的'WHEN'行显式测试条件。我喜欢这样做,因为这样测试的目的很明确,很明显当通过调试器(如Toad)时正在测试哪个表达式,并且当客户端不可避免地想要改变事物时,它很容易移动一行或者当他们在自己的路线上时,改变测试的顺序。
答案 1 :(得分:1)
为避免依赖NLS_DATE_FORMAT
,可以使用ANSI标准日期格式(Oracle支持):WHEN x.end_dt = date '3000-01-01' THEN ...
。整个CASE
表达式可以这样写:
CASE
WHEN x.end_dt = date '3000-01-01' OR (x.end_dt IS NULL AND x.reason IS NULL)
THEN 'Open'
ELSE 'Closed'
END AS enrolled