简体   繁体   English

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

[英]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?有没有办法只执行 WHERE 语句的一部分,可能使用基于数据库中数据的某种 IF-THEN 语句?

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.在此示例中,如果未设置开始日期(即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: 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. "'"您可以尝试替换TaskCreated <= '". $DisplayDateTime. "'"

with

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

The sql in PHP HEREDOC string. PHP HEREDOC 字符串中的 sql。 (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看SQL中的CASE语句

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: 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.

相关问题 SQL“ Where”语句仅适用于数据库列 - SQL “Where” Statement Only working for on Database Column PDO select语句卡在它询问数据库的部分 - PDO select statement stuck in the part where it asks database 我试图以这种方式将数据更新到数据库中,但是对于第一个if语句,其中if(!empty($ _ POST))可能不起作用 - I have tried to update data into database in this way but something maybe not working for the first if statement where if ( !empty($_POST) ) Laravel-数据显示不基于&#39;where&#39;语句 - Laravel - data showed not based on 'where' statement Insert语句仅将一些数据插入数据库 - Insert statement only inserting some of the data to the database 根据表数据有条件地执行SQ​​L查询/语句 - Execute a SQL query/statement conditionally based on table data 如果对数据库查询执行IF语句 - IF statement on database query wont execute Where 子句仅适用于部分视图 - Where clause only for part of the view 正在使用if else语句有效地根据URL的控制器和操作部分之后的参数加载视图,还是有更好的方法来执行此操作 - Is using if else statement to load view based on parameters after controller and action part of url efficient or is there a better way of doing this 确定WHERE语句的哪个部分失败 - Determine Which Part(s) of WHERE Statement Failed
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM