Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果列为空,请检查其他列_Mysql_Sql - Fatal编程技术网

Mysql 如果列为空,请检查其他列

Mysql 如果列为空,请检查其他列,mysql,sql,Mysql,Sql,我有下表,其中订单日期和交货日期为'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

我有下表,其中订单日期和交货日期为'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)
我正在尝试以下代码:

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'

您试图在其中使用列别名,这是不允许的。您必须使用下面的整个表达式

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')

您试图在其中使用列别名,这是不允许的。您必须使用下面的整个表达式

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')
尝试上面的代码。希望这会有所帮助


尝试上面的代码。希望这会有所帮助。

我已经在@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') ";

我在@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') ";

1:使用COALESCEdelivery\u date、order\u date代替标准SQL。2:在WHERE中重复计算,因为您不能在此处使用别名简单规则您不能在WHERE子句中使用别名。1:改为使用联合交货日期、订单日期,这是标准SQL。2:重复WHERE中的计算,因为此处不能使用别名。简单规则是,WHERE子句中不能使用别名。谢谢@Rahul。现在我正在尝试这段代码:从STR_TO_datecoalised_date,admission_date,在STR_TO_date'04/01/2017'、'%m/%d/%Y'和STR_TO_date'04/15/2017'、'%m/%d/%Y'之间选择*,我得到以下结果:1,3,4,5,但我希望是1,2,3,4,5,6谢谢@Rahul。现在我正在尝试这段代码:选择*从STR_TO_datecoalised_date,admission_date,'%m/%d/%Y',STR_TO_date'04/01/2017','%m/%d/%Y'和STR_TO_date'04/15/2017','%m/%d/%Y',我得到以下结果:1,3,4,5,但我期望1,2,3,4,5,6