我想比较两列中的两个日期并获得最大值然后与日期值进行比较.两列也可以保存NULL值.例如我想要下面的OUTPUT.如何使用最大的函数或者如果有什么else.I我再次使用输出来比较另一个日期.
Col A Col B OUTPUT
---------------------------------------
NULL NULL NULL
09/21/2013 01/02/2012 09/21/2013
NULL 01/03/2013 01/03/2013
01/03/2013 NULL 01/03/2013
Run Code Online (Sandbox Code Playgroud)
Mr.*_*ama 12
你的问题具体涉及两列,但我遇到了我需要GREATEST/ LEAST多于两列的情况.在这些情况下,您可以使用COALESCE解决方案并将其扩展到所需的列数.
这里是三列的例子a,b以及c:
GREATEST(
COALESCE(a, b, c),
COALESCE(b, c, a),
COALESCE(c, a, b)
)
Run Code Online (Sandbox Code Playgroud)
请注意,COALESCE更改的列顺序使每个输入列COALESCE至少是第一个元素一次.只有当所有输入列都为NULL时,它才会返回NULL.
在"通用解决方案"中,COALESCE语句的数量将等于输入列的数量:
GREATEST(
COALESCE(col1, col2, col3, col4, ....),
COALESCE(col2, col3, col4, ...., col1),
COALESCE(col3, col4, ...., col1, col2),
COALESCE(col4, ...., col1, col2, col3),
COALESCE(...., col1, col2, col3, col4),
...
)
Run Code Online (Sandbox Code Playgroud)
Dav*_*ber 11
您可以尝试以下方法:
SELECT cola, colb, COALESCE( GREATEST( cola, colb ), cola, colb ) AS output
FROM yourtable;
Run Code Online (Sandbox Code Playgroud)
原因COALESCE()是,如果其中一个参数是,则GREATEST()返回.NULLNULL
小智 7
您可以使用 NVL 函数消除任何列返回 NULL 的可能性。将任何 NULL 值替换为早于表中可能出现的任何日期的日期。
SELECT GREATEST(NVL(A,TO_DATE('01/01/1800','MM/DD/YYYY')),
NVL(B,TO_DATE('01/01/1800','MM/DD/YYYY'))) AS OUTPUT
FROM ...
Run Code Online (Sandbox Code Playgroud)
然后,如果一列或多列包含 NULL,GREATEST 函数将从提供的日期列表中返回最近的日期(最大日期),而不会无意中返回 NULL。
另一个a case expression用于处理null值的版本:
select cola, colb,
case when cola is null and colb is null then null
when cola is null then colb
when colb is null then cola
else greatest(cola, colb)
end as output
from <table>;
COLA COLB OUTPUT
---------- ---------- ----------
09/21/2013 01/02/2012 09/21/2013
01/03/2013 01/03/2013
01/03/2013 01/03/2013
Run Code Online (Sandbox Code Playgroud)
在您的选择中使用 OracleCASE... WHEN结构:
SELECT COLA, COLB, CASE
WHEN (COLA >= COLB OR COLB IS NULL)
THEN COLA
ELSE COLB
END
AS OUTPUT
FROM ...
Run Code Online (Sandbox Code Playgroud)