2013-03-16 46 views
0

我有两个表Security和CallPut。安全性(table1)包含security_id和maturity_date(非数值)和CallPut(表2),其中包含security_id和Odate(它们是非空值,其中包含日期时间格式值) 我想选择安全性(表1)中的所有行,但在MATURITY_DATE我想从大馆列,而不是那里的安全ID在Callput(表2)存在并具有安全表匹配MATURITY_DATE值SQL如果id匹配,则从第二个表中选择日期

如 安全性(表1)

Security_id|Maturity_date 
abcd  25Jan2020 
bcde  25jan2021 

Callput(tabble2)

Security_id|Odate 
abcd  25Jan2015 

所需的输出

Security_id|Maturity_date 
abcd  25Jan2015 (since here id is there in callput it takes odate) 
bcde  25jan2021 (since here id is not there in callput it takes maturity date) 

我使用的Oracle SQL 请帮助。在此先感谢

+0

你试过了什么? – Boaz 2013-03-16 19:42:51

回答

0
select s.Security_id, nvl(c.odate, s.Maturity_date) as Maturity_date 
from Security s 
left join 
Callput c 
on 
s.Security_id = c.Security_id 

附注:Oracle广泛文档中加入只是注意到这是一个Oracle问题,我的代码是MS SQL Server
编辑:更正为Oracle语法。

+0

@Egor Skriptunoff:谢谢 – 2013-03-16 19:38:47

+0

有没有办法与coalesce做呢?只是好奇,因为我多次尝试过,但无法做到。 – user2177784 2013-03-23 09:36:04

+0

@ user2177784不能用于Oracle,但是在MS SQL中,ISNULL()基本上与COALESCE()相同,其中有两个参数 – 2013-03-23 19:44:45

1
select 
    s.Security_id, 
    NVL(c.Odate, s.Maturity_date) Maturity_date 
from 
    security s left join callput c 
    on (c.security_id = s.security_id); 
+0

嗨,我会尝试所有这些,并回来。但在此先感谢 – user2177784 2013-03-23 08:59:11

+0

嗨,我读了一点关于nvl,它不是用来只替换空值。它也适用于非空值。请咨询 – user2177784 2013-03-23 09:52:46

+0

如果要替换非空值,则必须在PL/SQL中查找'case when'子句。尝试编辑您的问题更具体,我或其他人会尝试回答。外(左)连接两个表,在非对应匹配的情况下会产生空值,所以我使用了NVL。 – 2013-03-23 14:00:31

相关问题