簡體   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