问题: 我正在破译一个名为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
答案 0 :(得分:2)
以下是该代码段的作用:
如果prev_start_date
为NULL
,则函数返回字符串'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_date
是NULL
- 恰好是不会通过过滤器的值的组合。< / 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。