任何人都可以从Oracle DB中解释以下SQL语句:
select decode(TRIM(to_char(SYSDATE,'Day')),'Monday','3','1') from dual
答案 0 :(得分:25)
首先,让我们从to_char
开始。 to_char(SYSDATE,'Day')
将为您提供今天的一周中的某一天。 to_char
允许您将日期(在此情况下,今天指定sysdate
后的日期)转换为特定格式的字符串。看看这里可以使用的日期格式的其他一些例子:
http://www.techonthenet.com/oracle/functions/to_char.php
trim
删除了前导空格和尾随空格。
现在为decode
。您可以将decode
视为if else语句。看看:
http://www.techonthenet.com/oracle/functions/decode.php
在您的特定示例中,您可以将此语句理解为:如果今天是星期一,则返回3,否则返回1。
decode
也允许你做一些像这样复杂的事情:
select decode(TRIM(to_char(SYSDATE,'Day')),'Monday','3','Tuesday',5,'1')
from dual
这将是:如果今天是星期一返回3,否则如果今天是星期二返回5,否则返回1
答案 1 :(得分:13)
如果它当前是星期一(并且语言环境使得日期呈现为“星期一”),则返回3
,否则返回1
。
DECODE(a, b,c, d,e, f,g, ..., h)
将依次将a
与b
,d
,f
等进行比较。如果a
为b
,则DECODE
会返回c
;如果a
为d
,则DECODE
会返回e
;等等。如果a
不是其中任何一项,则DECODE
会返回h
。 (h
是可选的;如果未提供h
,则默认返回值为NULL
。)
答案 2 :(得分:0)
下面是部分说明:
SYSDATE
正在返回服务器日期,例如15-APR-19,其格式基于本地
to_char(SYSDATE,'Day')
正在转换为字符串,并返回日期为15年4月15日的星期一(星期一)
TRIM(to_char(SYSDATE,'Day'))
正在删除
前后的空白解码功能类似于if语句,因此可以简化代码。对于当前示例,如果我们用SQL编写,则应如下所示:
CASE
WHEN TRIM(to_char(SYSDATE,'Day')) = 'Monday' THEN '3'
WHEN TRIM(to_char(SYSDATE,'Day')) = 'Tuesday' THEN '4'
ELSE '1'
END
有关完整参考,请参见https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions040.htm