2015-04-08 37 views
1

我正在編寫一個基於篩選條件從數據庫表中填寫記錄的過程。現在作爲用戶可以應用過濾器或不可以。所以基於這個過濾標準將得到應用。SELECT查詢使用可選的用戶提供的參數篩選記錄

即如果過濾器參數將包含任何值,只有它不會應用條件。

注:我可以通過如果實現吧..別的...條件並執行不同的查詢完全分開,讓我的願望輸出。但是,我想請教的是,有沒有它,而不是是否..任何其他更好的辦法..

(這裏i_status_id,i_category_id可以包含任何價值或可能不會)

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `FilterRecord`$$ 

CREATE PROCEDURE `FilterRecord`(IN i_status_id BIGINT,IN i_category_id BIGINT) 
BEGIN 
    SELECT 
      Item_backlog.backlog_id AS backlog_id, 
      Item_backlog.title AS backlog_name, 
      Item_backlog_Group.title AS group_Name, 
      Item_backlog.description AS description, 
      Item_backlog.est_start_date AS estimated_start_date, 
      Item_backlog.est_end_date AS estimated_end_date, 
      Item_backlog.actual_start_date AS actual_start_date, 
      Item_backlog.actual_end_date AS actual_end_date, 
      Item_backlog.estimated_hours AS estimated_hours, 
      Item_backlog.actual_hours AS actual_hours, 
      Item_backlog.status_id AS status_id, 
      APV_Status.name AS status_name , 
      Item_backlog.priority_id AS priority_id, 
      APV_Priority.name AS priority_name, 
      Item_backlog.rank AS rank, 
      Item_backlog.isActive AS isActive, 
      Item_backlog.created_by_id AS created_by_id, 
      Item_backlog.created_on AS created_on, 
      Item_backlog.modified_by_id AS modified_by_id, 
      Item_backlog.modified_on AS modified_on 
     FROM 
      Item_backlog 
     INNER JOIN  
      ApplicationParamValue AS APV_Status ON (Item_backlog.status_id=APV_Status.appParamValueId) 
     INNER JOIN  
      ApplicationParamValue AS APV_Priority ON (Item_backlog.Priority_Id=APV_Priority.appParamValueId) 
     INNER JOIN 
      Item_backlog_group AS Item_backlog_Group ON (Item_backlog.backlog_group_id=Item_backlog_Group.backlog_group_id) 
     WHERE 
      Item_backlog.status_id=i_status_id 
     AND 
      Item_backlog.category_id=i_category_id 

END$$ 

DELIMITER ; 

回答

0

嘗試下面將應用基於參數傳遞過濾條件:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS `FilterRecord`$$ 

CREATE PROCEDURE `FilterRecord`(IN i_status_id BIGINT,IN i_category_id BIGINT) 
BEGIN 

    DECLARE Var_status_id VARCHAR(200); 
    DECLARE Var_category_id VARCHAR(200); 
DECLARE andCondition VARCHAR(200); 


    IF i_status_id<>0 THEN 
     SET Var_status_id=CONCAT(' (Item_backlog.status_id = ', i_status_id,')'); 
     SET andCondition ='AND'; 
    ELSE 
     SET Var_status_id=""; 
     SET andCondition =''; 
    END IF; 


    IF i_category_id<>0 THEN 
     SET Var_category_id=CONCAT(andCondition,' (Item_artifact_category_mapping.category_id = ', i_category_id,')'); 
    ELSE 
     SET Var_category_id=""; 
    END IF; 


    SET @SQL := CONCAT('SELECT 
      Item_backlog.backlog_id AS backlog_id, 
      Item_backlog.title AS backlog_name, 
      Item_backlog_Group.title AS group_Name, 
      Item_backlog.description AS description, 
      Item_backlog.est_start_date AS estimated_start_date, 
      Item_backlog.est_end_date AS estimated_end_date, 
      Item_backlog.actual_start_date AS actual_start_date, 
      Item_backlog.actual_end_date AS actual_end_date, 
      Item_backlog.estimated_hours AS estimated_hours, 
      Item_backlog.actual_hours AS actual_hours, 
      Item_backlog.status_id AS status_id, 
      APV_Status.name AS status_name , 
      Item_backlog.priority_id AS priority_id, 
      APV_Priority.name AS priority_name, 
      Item_backlog.rank AS rank, 
      Item_backlog.isActive AS isActive, 
      Item_backlog.created_by_id AS created_by_id, 
      Item_backlog.created_on AS created_on, 
      Item_backlog.modified_by_id AS modified_by_id, 
      Item_backlog.modified_on AS modified_on 
     FROM 
      Item_backlog 
     INNER JOIN  
      ApplicationParamValue AS APV_Status ON (Item_backlog.status_id=APV_Status.appParamValueId) 
     INNER JOIN  
      ApplicationParamValue AS APV_Priority ON (Item_backlog.Priority_Id=APV_Priority.appParamValueId) 
     INNER JOIN 
      Item_backlog_group AS Item_backlog_Group ON (Item_backlog.backlog_group_id=Item_backlog_Group.backlog_group_id) 
     WHERE', Var_status_id, Var_category_id); 

     PREPARE stmt FROM @SQL; 
     EXECUTE stmt; 

END$$ 

DELIMITER ; 
0

假設您有一個指定參數未指定的定義值(例如,我已經使用下面的NULL來指示參數未提供),您可以執行的操作是有條件地應用參數。

CREATE PROCEDURE `FilterRecord`(IN i_status_id BIGINT,IN i_category_id BIGINT) 
BEGIN 
    SELECT 
      Item_backlog.backlog_id AS backlog_id, 
      -- ... 
     FROM 
      Item_backlog 
     INNER JOIN  
      -- .. 
     WHERE 
      (Item_backlog.status_id=i_status_id OR i_status_id IS NULL) 
     AND 
      (Item_backlog.category_id=i_category_id OR i_category_id IS NULL); 
END 

但請注意,這樣做的性能可能會降低。

SqlFiddle example here - 我假設MySql,順便說一句,根據您的主標籤和反引號。

+0

我已經嘗試過這種方法,它不會工作..作爲OR查找的條件下半年如果上半年是假吧?但即使篩選條件不包含任何值也不會查找您提到的OR部分的後半部分,即無論如何Item_backlog.status_id = i_status_id只返回true –

+0

我不能正確理解您。你可以在一個小表上爲輸入'i_status_id'和'i_category_id'添加一個小的真值表(可能使用我的SqlFiddle)以及期望的結果是什麼?謝謝 – StuartLC

+0

@ChandanPrakashSharma我敢肯定,你接受的答案與我的答案一樣(儘管使用零,而不是默認值),但請注意,在另一個答案中,如果兩個輸入都是默認的,那麼查詢會因爲'WHERE'尾隨而崩潰。 – StuartLC