[英]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.