簡體   English   中英

如果為空,則忽略WHERE子句中的條件

[英]Ignore conditions in WHERE clause if empty

我想顯示通過WHERE子句過濾的數據。 我已經應用了一些變量來代替條件值,現在如何在不應用條件的情況下獲取數據。 我試過了,但是。 如果給出了值,它是有效的,但是如果沒有給出值,則它不起作用。

應該怎么辦?

它有3個過濾器。 如果選擇了日期 ,則應按給定日期顯示數據。 同樣,如果選擇了來源 ,則應該在給定日期和給定來源之前顯示數據。 這樣,它應該可以工作。

$date_from = NULL;  //the value will be given if the user selects the date range
$date_to = NULL;

$src_id = NULL;  // this value will be given if the user wants data from specific source
$gndr_id = NULL; // if user want data by gender

$leadSql = "SELECT 
            lead.id as lead_id
          , lead.name as lead_name
          , lead.phone as lead_phone
          , lead.email as lead_email 
          , gender.name as lead_gender
          , treatment.name as treatment_name
          , lead.date as lead_date
          , source.name  as  source_name
          , status.name  as status_name
          , lead.remark as lead_remark
        FROM lead 
        join treatment on treatment.id = lead.treatment_id
        join gender on gender.id = lead.gender_id
        join source on source.id = lead.source_id
        join status on status.id = lead.status_id

        where (lead.date BETWEEN $date_from and $date_to) and 
        (lead.source_id = $src_id ) and (lead.gender_id = $gndr_id)

        ORDER BY lead_date DESC";

請建議我一些方法。

據我所知,您需要在一條專用語句中包括整個WHERE行,以說明是否存在值,如果不忽略它,則應用WHERE子句。

 if($date_from != NULL && $date_to != NULL .....){
     $where_clause = "where (lead.date BETWEEN $date_from and $date_to) and 
            (lead.source_id = $src_id ) and (lead.gender_id = $gndr_id)";
 }  else{
     $where_clause ="";
 }

$leadSql = "SELECT 
                lead.id as lead_id
              , lead.name as lead_name
              , lead.phone as lead_phone
              , lead.email as lead_email 
              , gender.name as lead_gender
              , treatment.name as treatment_name
              , lead.date as lead_date
              , source.name  as  source_name
              , status.name  as status_name
              , lead.remark as lead_remark
            FROM lead 
            join treatment on treatment.id = lead.treatment_id
            join gender on gender.id = lead.gender_id
            join source on source.id = lead.source_id
            join status on status.id = lead.status_id

            ".$where_clause."

            ORDER BY lead_date DESC";

您可以根據需要調整if / else。 這是最簡單的解決方案。 您可以為每個變量編寫一個條件語句,並在最后將它們連接在一起。

$where = [];
$where_clause = '';

if ($date_from && $date_to) {
    $where[] = "(lead.date BETWEEN $date_from and $date_to)";
}

if ($src_id) {
    $where[] = "(lead.source_id = $src_id )";
}

if ($gndr_id) {
    $where[] = "(lead.gender_id = $gndr_id)";
}

if (count($where)) {
    $where_clause = 'WHERE ' . implode(' AND ', $where);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM