2012-09-18 40 views
-2

我的Oracle SQL查询这样IF条件SQL查询的WHERE子句中

SELECT * 
FROM test 
WHERE 1 =1 
AND req_no IN 
    (SELECT req_no 
    FROM test 
    WHERE date1 IS NOT NULL 
    AND date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 
) 

的问题是WHERE条件不能正常工作。在上述情况下,如果'date1' 不是NULL,那么我想检查'FROM'和'TO'日期之间的'date1'。 * 编辑 * 我已经加入样品表数据

Test table 
From date: 1-JUN-2012 
To date: 30-JUN-2012 

record  date1   date2   date3 
1  12-JUN-2012  13-JUN-2012   12-JUN-2012 
2  null   null    12-JUN-2012 
3  null   3-JUN-2012   null 
4  12-JUN-2012  null    null 
5  12-JUN-2012  13-JUL-2012   12-JUN-2012 
6  null    null    null 

在上面的记录将返回记录数= 1,2,3,4不第六纪录。

+0

这段代码是不是最好的做法的一个例子但它应该解决你给的业务规则。所以你需要定义“不能正常工作”。最简单的方法是给我们一些测试数据和你期望的输出。 – APC

+0

感谢您的建议。我添加了示例数据和输出 – Raje

+0

@APC:我有示例表数据和输出 – Raje

回答

0

您可以使用OR这样的:

WHERE date1 IS NULL 
    OR date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 

你的整个查询应该是:

SELECT * 
FROM test 
WHERE 1 =1 
AND req_no IN 
    (SELECT req_no 
    FROM test 
    WHERE date1 IS NULL 
    OR date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 
) 
+0

@Raje从你的问题**如果'date1'不是NULL,那么我想检查'FROM'之间的'date1'和'TO'约会**这意味着如果Date是'NULL',你不想在两者之间检查。对? – hims056

+0

是的。像这样 – Raje

+0

@Raje然后上述查询中的条件与你想要的相同。不是吗? – hims056

0

1=1是多余的。既然你说你想检查是否date1的是日期的范围之间,或者如果它是零,也没关系,试试:

SELECT * 
FROM test 
WHERE req_no IN 
    (SELECT req_no 
    FROM test 
    WHERE date1 BETWEEN to_date('06/01/2012','mm/dd/yyyy') 
     AND to_date('06/30/2012','mm/dd/yyyy') 
     OR date1 is null 
) 
0

我认为你不需要子查询,你可以使用单个查询 直接选择您的相关记录像还你不需要检查date1为空或不是

SELECT * FROM test 
    WHERE TO_DATE('12/2/2003','MM/DD/YYYY') <= date1 
AND TO_DATE('12/5/2003','MM/DD/YYYY') >= date1 
0

找到了一些解决方法,但它是非常漫长的

SELECT * 
FROM dates 
WHERE 1 =1 
AND( 
    no IN 
    (SELECT no FROM dates WHERE date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date2 is null and date3 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date2 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date1 is null and date3 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date3 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date1 is null and date2 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date3 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date1 BETWEEN '1-JUN-12' AND '30-JUN-12' and date2 BETWEEN '1-JUN-12' AND '30-JUN-12') 
    or 
    no IN 
    (SELECT no FROM dates WHERE date1 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date1 BETWEEN '1-JUN-12' AND '30-JUN-12' and date3 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date3 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date3 BETWEEN '1-JUN-12' AND '30-JUN-12' and date2 is null) 
    or 
    no IN 
    (SELECT no FROM dates WHERE date2 BETWEEN '1-JUN-12' AND '30-JUN-12' 
    and date3 BETWEEN '1-JUN-12' AND '30-JUN-12' and date1 is null) 

) 
+1

啊 - 但这不是最初说明问题的方法。在你的初始描述中,你只是检查'date1'。如果你没有完全描述这个问题,你不会得到很多有用的答案。因为你已经有了六行SELECT条件 - 看起来有点像矫枉过正。 –