简体   繁体   中英

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

Is there a way to only execute part of a WHERE statement perhaps using some sort of IF-THEN statement based on data in the database?

The code below displays scheduled tasks for a specific date correctly in most cases, but there is an anomaly. If someone creates a task and then sets a start date before the date they created it, the task won't show up even though it is scheduled on that day.

In this example, we only want to use the create date (ie TaskCreated <= '". $DisplayDateTime. "'" ) if the start date is not set (ie TaskStartDate = '' OR TaskStartDate is NULL' ) If the TaskStartDate is set, then we want to use that date instead of the create date for the date range.

// 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

How is the best way to fix that anomaly?

You can try replacing TaskCreated <= '". $DisplayDateTime. "'"

with

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

The sql in PHP HEREDOC string. (easier to read)

$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;
//

Look at the CASE statement in SQL

In order to get it to work as expected, you would need to change:

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

to this:

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

This would show both tasks created on a certain date or started on a certain date and show tasks with no start date.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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