2017-04-14 86 views
0

我有以下表,其中order_datedelivery_date的类型为“VARCHAR”检查其他列列是否为空

id  name  order_date  delivery_date 
--------------------------------------------------------- 
1  A   04/01/2017  04/08/2017 
2  B   04/01/2017  NULL 
3  C   04/02/2017  04/03/2017 
4  D   04/04/2017  04/05/2017 
5  E   04/05/2017  04/11/2017 
6  F   04/11/2017  NULL 
7  G   04/15/2017  04/17/2017 
8  H   04/18/2017  NULL 

我需要所有具有

* delivery_date between 04/01/2017 TO 04/15/2017 
* if delivery_date IS NULL then check order_date between 04/01/2017 TO 04/15/2017 
    (in this case order_date is assumed as delivery_date) 

我记录'm试试这个代码:

SELECT *, 
IF(delivery_date IS NOT NULL, `delivery_date`, `order_date`) as `final_date` 
FROM `test` 
WHERE STR_TO_DATE(`final_date` ,'%m/%d/%Y') BETWEEN STR_TO_DATE('04/01/2017','%m/%d/%Y') AND STR_TO_DATE('04/15/2017','%m/%d/%Y') 

但是是给这个错误:

Unknown column 'final_date' in 'where clause' 
+1

#1:使用'COALESCE(delivery_date,order_date)'而不是哪个是Standrad SQL。 #2:在'WHERE'重复计算,因为你不能在这里使用别名 – dnoeth

+0

简单的规则你不能在where子句中使用别名。 –

回答

2

您正试图使用​​不允许的WHERE列别名。你将不得不使用下面的表达整个

IF(delivery_date IS NOT NULL, `delivery_date`, `order_date`) 

WHERE条款应该看起来像

WHERE STR_TO_DATE(COALESCE(`delivery_date`, `order_date`) ,'%m/%d/%Y') BETWEEN STR_TO_DATE('04/01/2017','%m/%d/%Y') 
AND STR_TO_DATE('04/15/2017','%m/%d/%Y') 
+0

谢谢@Rahul。现在我正在尝试此代码: 'SELECT * FROM test WHERE STR_TO_DATE(COALESCE(discharge_date,admit_date),'%m /%d /%Y')BETWEEN STR_TO_DATE('04/01/2017','% m /%d /%Y')AND STR_TO_DATE('04/15/2017','%m /%d /%Y') 我得到以下结果:1,3,4,5但I预计1,2,3,4,5,6 – Pranab

1
SELECT *, 
IF(delivery_date IS NOT NULL, `delivery_date`, `order_date`) as `final_date` 
FROM `test` 
WHERE STR_TO_DATE(IFNULL(`delivery_date`,`final_date`) ,'%m/%d/%Y') BETWEEN STR_TO_DATE('04/01/2017','%m/%d/%Y') AND STR_TO_DATE('04/15/2017','%m/%d/%Y') 

尝试上述code.Hope这将有助于。

0

我已经想通过@Rahul和@Sagar Gangwal提供的示例帮助查询。查询是:

SELECT * FROM `test` 
WHERE 
    STR_TO_DATE(COALESCE(NULLIF(`delivery_date`,''),`order_date`) ,'%m/%d/%Y') 
    BETWEEN STR_TO_DATE('04/01/2017','%m/%d/%Y') AND STR_TO_DATE('04/15/2017','%m/%d/%Y') ";