2015-02-10 66 views
1

假设我有以下SQL select条款:如果内部SELECT子句

SELECT * FROM some_table_1 t1 
    join some_table t2 on t2.some_id = t1.id and 
    t2.school_id = 56 and 
    t1.is_valid = 1 and 
    t2.status in (15, 16, 17, 18); 

但我也来检查,如果t2.status = 18,那么我也检查t2.date < 01.01.2015

我怎样才能添加此条件到这select

+2

你想在这些情况下做什么?我不知道你是否想要一个'WHERE'子句或'CASE'语句。 – 2015-02-10 13:54:33

+0

AND(t2.date <01.01.2015 OR t2.status <> 18) – jarlh 2015-02-10 13:55:16

+1

将'18'放入'IN'子句有什么意义? – 2015-02-10 13:55:58

回答

1

这听起来像你只是想加入上行时,如果日期(这是一个列的错误名称,因为它是一个Oracle保留字,我也假定它是DATE数据类型)小于2015年1月1日,那么它的状态为18。应该这样做:

SELECT * 
FROM some_table_1 t1 
     join some_table t2 on t2.some_id = t1.id 
          and t2.school_id = 56 
          and t1.is_valid = 1 
          and (t2.status in (15, 16, 17) 
            or (t2.status = 18 and t2.date < to_date('01.01.2015', 'dd.mm.yyyy.'))); 
0

只需添加一个or检查“不是18”,或符合第二个条件:

SELECT * 
FROM some_table_1 t1 
join some_table t2 
on  t2.some_id = t1.id 
and t2.school_id = 56 
and t1.is_valid = 1 
and t2.status in (15, 16, 17, 18) 
/* added part */ 
where (t2.status != 18 
     or t2.date < to_date('01.01.2015', 'dd.MM.yyyy') 
     ) 
+1

把IN放在IN子句中有什么意义? – 2015-02-10 13:56:33

+1

@CoderofCode:如果你没有它,它会忽略'status = 18'的行...... – 2015-02-10 14:07:43

0

您可以添加:

where t2.status <> 18 or t2.date < date '2015-01-01'