14

2 つの列から 2 つの日付を比較し、最大のものを取得してから、日付値と比較したいと考えています。2 つの列には NULL 値も保持できます。

たとえば、以下の OUTPUT が必要です。

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 

最大の機能を使用するにはどうすればよいですか、それ以外に何かありますか? 私は再び出力を使用して、別の日付と比較しています。

4

9 に答える 9

21

次のことを試してみてください。

SELECT cola, colb, COALESCE( GREATEST( cola, colb ), cola, colb ) AS output
  FROM yourtable;

の理由は、パラメータのいずれかが である場合COALESCE()GREATEST()返されるためです。NULLNULL

于 2016-02-08T03:00:49.277 に答える
6

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 
于 2013-10-04T16:41:56.893 に答える
4

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 ...

GREATEST 関数は、1 つ以上の列に NULL が含まれている場合に誤って NULL を返すことなく、指定された日付のリストから最新の日付 (最大日付) を返します。

于 2018-03-14T10:47:08.240 に答える
4

選択でOracleCASE... WHEN構造を使用します。

SELECT COLA, COLB, CASE
  WHEN (COLA >= COLB OR COLB IS NULL)
    THEN COLA
  ELSE COLB
  END
  AS OUTPUT
FROM ...
于 2013-10-04T16:37:47.397 に答える
3

比較する列が多数 (2 つまたは 3 つを超える) ある場合、さまざまな CASE の組み合わせをすべて処理するのは扱いにくくなる可能性があります。あなたは試すことができます(11g):

with x as (
  select 1 as id, sysdate - 30 as col1, sysdate-50 as col2, sysdate-20 as col3,null as col4, sysdate-1 as col5 from dual
  union
  select 2 as id, sysdate - 10 as col1, sysdate-20 as col2, null as col3,null as col4, sysdate-35 as col5 from dual
  union
  select 3 as id, null as col1, null as col2, null as col3, null as col4, null as col5 from dual
)
select id, max(dates)
from x
UNPIVOT INCLUDE NULLS
(dates FOR colname IN (col1,col2,col3,col4,col5))
group by id
于 2013-10-04T18:17:30.240 に答える
0

何かのようなもの

SELECT CASE WHEN ColA is NULL and ColB is NULL then NULL
WHEN coalesce(ColA, '01/01/1753')>coalesce(ColB, '01/01/1753') then ColA
ELSE ColB END as Output
于 2013-10-04T16:39:26.523 に答える
0

NVL を使用してこれを解決しますが、比較される列の数に基づいて共謀が増加します。

select A.*, *greatest("COL A", "COL B") "DIRECT COMPARE"*, **greatest(nvl("COL A", "COL B"), nvl("COL B", "COL A")) "NVL COMPARE"**
from (
SELECT NULL "COL A", SYSDATE "COL B", SYSDATE "NEEDED RESULT" FROM DUAL UNION
SELECT SYSDATE - 180 , NULL  , SYSDATE - 180 FROM DUAL UNION
SELECT SYSDATE - 180 , SYSDATE , SYSDATE FROM DUAL ) A;
于 2019-11-12T12:00:19.937 に答える