Oracle DECODE语法

时间:2017-09-27 16:44:43

标签: sql oracle decode

问题: 我正在破译一个名为DECODE的函数的查询。我查找了语法(列,值,替换值,默认值),但我不承认以下语法正在做什么。

查询:

WHERE 1=1
  AND DECODE(a1.prev_start_date, NULL, 'THIS IS NOT NULL', a1.prev_end_date) IS NOT NULL 

当我添加上面的语法时,下面的行不显示,为什么?

表:

ID       prev_start_date    prev_end_date
456        2/13/2017          

2 个答案:

答案 0 :(得分:2)

以下是该代码段的作用:

如果prev_start_dateNULL,则函数返回字符串'THIS IS NOT NULL'。该字符串不是NULL,因此条件的计算结果为TRUE。

如果prev_start_date不是NULL,则DECODE()会返回prev_end_date。仅当prev_end_date不是NULL时,条件为TRUE。

SO:条件相当于

(prev_start_date is null or prev_end_date is not null)

显然,在您提供的示例中,prev_start_date不是NULL,而prev_end_dateNULL - 恰好是不会通过过滤器的值的组合。< / p>

答案 1 :(得分:0)

有效日期记录

通常,当记录具有日期有效性(例如,开始日期和结束日期)时,约定是使用between条件,其中结束日期具有NVL函数调用。

校长认为很多生效日期尚未结束。

如您所示,在开始日期前检查NULL条件是否满足此条件(将排除NULL)。

关于您显示的解码语句,

WHERE 1=1
  AND DECODE(a1.prev_start_date, NULL, 'THIS IS NOT NULL', a1.prev_end_date) IS NOT NULL

解码语句可以读作:

&#34;如果开始日期为NULL,那么&#39;这不是空的&#39;,否则prev_end_date&#34;没有意义。

我的条件如下:

SCOTT@db>WITH test AS
  2    (SELECT hiredate prev_start_date, sysdate prev_end_date FROM emp
  3    UNION ALL
  4    SELECT to_date(NULL,'dd-mon-yyyy'), to_date(NULL,'dd-mon-yyyy') FROM dual
  5    )
  6  SELECT prev_start_date,
  7    prev_end_date
  8  FROM test t
  9  WHERE 1=1
 10  AND sysdate between t.prev_start_date and NVL(t.prev_end_date, sysdate);
PREV_START_DATE          PREV_END_DATE            
17-DEC-1980 12:00:00 AM  27-SEP-2017 12:40:41 PM  
20-FEB-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
22-FEB-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
02-APR-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
28-SEP-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
01-MAY-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
09-JUN-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
09-DEC-1982 12:00:00 AM  27-SEP-2017 12:40:41 PM  
17-NOV-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
08-SEP-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
12-JAN-1983 12:00:00 AM  27-SEP-2017 12:40:41 PM  
03-DEC-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
03-DEC-1981 12:00:00 AM  27-SEP-2017 12:40:41 PM  
23-JAN-1982 12:00:00 AM  27-SEP-2017 12:40:41 PM  


14 rows selected. 

从结果集中排除NULL。