繁体   English   中英

有没有办法根据数据库中的数据只执行 WHERE 语句的一部分?

[英]Is there a way to only execute part of a WHERE statement based on data in the database?

有没有办法只执行 WHERE 语句的一部分,可能使用基于数据库中数据的某种 IF-THEN 语句?

下面的代码在大多数情况下正确显示了特定日期的计划任务,但存在异常。 如果某人创建了一个任务,然后在他们创建它的日期之前设置了一个开始日期,那么即使它被安排在当天,该任务也不会显示。

在此示例中,如果未设置开始日期(即TaskStartDate = '' OR TaskStartDate is NULL' ),我们只想使用创建日期(即TaskCreated <= '". $DisplayDateTime. "'" )如果TaskStartDate是设置,那么我们想使用该日期而不是日期范围的创建日期。

// Displays tasks that are scheduled on a particular date or marked as "focus"
$sql = "SELECT * FROM Reminders";
$sql = $sql . " " . "WHERE TaskUserID = " . $loggedinuser;
$sql = $sql . " " . "AND ( TaskFocus = 1";
$sql = $sql . " " . "OR ( TaskCreated <= '" . $DisplayDateTime . "'";
$sql = $sql . " " . "AND ( TaskStartDate <= '" . $DisplayDate . "' OR TaskStartDate = '' OR TaskStartDate is NULL )";
$sql = $sql . " " . "AND ( TaskPauseDate <= '" . $DisplayDate . "' OR TaskPauseDate = '' OR TaskPauseDate is NULL )";
$sql = $sql . " " . "AND ( TaskSchedDate >= '" . $DisplayDate . "' AND TaskSchedDate is NOT NULL )" ;
$sql = $sql . " " . "AND ( TaskDueDate <> '" . $DisplayDate . "'  OR TaskDueDate = '' OR TaskDueDate is NULL )";                            
$sql = $sql . " " . ") )";
$sql = $sql . " " . "AND ( TaskPauseDate <= '" . $DisplayDate . "' OR TaskPauseDate = '' OR TaskPauseDate is NULL )";
$sql = $sql . " " . "ORDER BY TaskFocus DESC, TaskPriority ASC, TaskSchedDate ASC, TaskDueDate ASC";

SQL:

SELECT * FROM Reminders 
   WHERE TaskUserID = 1 
   AND ( ( TaskCreated <= '2020-12-03 23:59:59' 
      AND ( TaskStartDate <= '2020-12-03' OR TaskStartDate = '' OR TaskStartDate is NULL ) 
      AND ( TaskPauseDate <= '2020-12-03' OR TaskPauseDate = '' OR TaskPauseDate is NULL ) 
      AND ( TaskSchedDate >= '2020-12-03' AND TaskSchedDate is NOT NULL ) 
      AND ( TaskDueDate >= '2020-12-03' OR TaskDueDate = '' OR TaskDueDate is NULL ) ) ) 
   AND ( TaskPauseDate <= '2020-12-03' OR TaskPauseDate = '' OR TaskPauseDate is NULL ) 
   ORDER BY TaskFocus DESC, TaskPriority ASC, TaskSchedDate ASC, TaskDueDate ASC

解决该异常的最佳方法是什么?

您可以尝试替换TaskCreated <= '". $DisplayDateTime. "'"

((TaskCreated <= '". $DisplayDateTime. "') OR (TaskStartDate = '' OR TaskStartDate is NULL'))"

PHP HEREDOC 字符串中的 sql。 (更容易阅读)

$sql = <<<WXC
SELECT * FROM Reminders 
WHERE    TaskUserID = $loggedinuser
    AND (   (( TaskStartDate <= '{$DisplayDate}' and (TaskStartDate <> '' AND TaskStartDate is NOT NULL ))
            OR  (TaskCreated <= '{$DisplayDateTime}' AND ( TaskStartDate is NULL OR TaskStartDate = '' )  ))
        AND ( TaskPauseDate <= '{$DisplayDate}' OR TaskPauseDate = '' OR TaskPauseDate is NULL )
        AND ( TaskSchedDate >= '{$DisplayDate}' AND TaskSchedDate is NOT NULL )
        AND ( TaskDueDate <> '{$DisplayDate}'  OR TaskDueDate = '' OR TaskDueDate is NULL )  
        AND ( TaskPauseDate <= '{$DisplayDate}' OR TaskPauseDate = '' OR TaskPauseDate is NULL ))
ORDER BY TaskFocus DESC, TaskPriority ASC, TaskSchedDate ASC, TaskDueDate ASC
WXC;
//

看SQL中的CASE语句

为了让它按预期工作,您需要更改:

$sql = $sql. " ". "AND ( TaskCreated <= '". $DisplayDateTime. "'";

对此:

$sql = $sql . " " . "AND ( ( TaskCreated <= '" . $DisplayDateTime . "'";    
$sql = $sql . " " . "OR ( TaskStartDate <= '" . $DisplayDate . "' OR TaskStartDate = '' OR TaskStartDate is NULL ) )";

这将显示在某个日期创建或在某个日期开始的两个任务,并显示没有开始日期的任务。

SQL:

SELECT * FROM chReminders 
   WHERE TaskUserID = 1 
   AND ( ( ( TaskCreated <= '2020-12-03 23:59:59' 
         OR ( TaskStartDate <= '2020-12-03' OR TaskStartDate = '' OR TaskStartDate is NULL ) ) 
      AND ( TaskStartDate <= '2020-12-03' OR TaskStartDate = '' OR TaskStartDate is NULL ) 
      AND ( TaskPauseDate <= '2020-12-03' OR TaskPauseDate = '' OR TaskPauseDate is NULL ) 
      AND ( TaskSchedDate >= '2020-12-03' AND TaskSchedDate is NOT NULL ) 
      AND ( TaskDueDate >= '2020-12-03' OR TaskDueDate = '' OR TaskDueDate is NULL ) ) ) 
   AND ( TaskPauseDate <= '2020-12-03' OR TaskPauseDate = '' OR TaskPauseDate is NULL ) 
   ORDER BY TaskFocus DESC, TaskPriority ASC, TaskSchedDate ASC, TaskDueDate ASC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM