多变量If语句

时间:2014-03-31 22:17:07

标签: mysql sql

我最近能够生成一个过程,如果未设置变量,我可以将其设置为null。现在我正在寻找多个变量,但是如果没有将值设置为该变量,那么它将返回所有行。

BEGIN

DECLARE ps_Project_Leader VARCHAR(15);
DECLARE ps_RD_Plan VARCHAR (15);
DECLARE ps_Approval_Status VARCHAR (15);
DECLARE ps_Design_Plan VARCHAR (15);

        SET ps_Project_Leader = ifnull(Project_Leader,null);
        SET ps_RD_Plan = ifnull(RD_Plan,null);
        SET ps_Approval_Status = ifnull(Approval_Status,null);
        SET ps_Design_Plan = ifnull(Design_Plan,null);

 SELECT pp.pid,
    pp.description,
    pp.approval_status,
    pp.design_plan,
    pp.rd_plan,
    pp.estimated_completion,
    pp.project_leader,
    pp.actual_completion
 FROM project_register pp

WHERE pp.project_leader =Project_Leader
        OR Project_Leader is null

and pp.rd_plan =RD_Plan
        OR RD_Plan is null

and pp.approval_status = Approval_Status
        OR Approval_Status is null

and pp.design_plan = Design_Plan
        OR Design_Plan is null

    and 
    PP.actual_completion is null;

end

例如,如果我设置了2个变量而不是其他2个,我不希望它搜索尚未设置的变量。

非常感谢,如果我没有完全理解(我是新手,所以我很抱歉)我很乐意清理。

2 个答案:

答案 0 :(得分:1)

您需要正确填充WHERE表达式:

WHERE (pp.project_leader = ps_Project_Leader
        OR ps_Project_Leader is null)
and (pp.rd_plan = ps_RD_Plan
        OR ps_RD_Plan is null)
and (pp.approval_status = ps_Approval_Status
        OR ps_Approval_Status is null)
and (pp.design_plan = ps_Design_Plan
        OR ps_Design_Plan is null)
and PP.actual_completion is null;

因为AND的优先级高于OR

答案 1 :(得分:0)

您没有引用局部变量,只引用过程参数。 (看起来你实际上并不需要局部变量。)

我更喜欢在AND和OR谓词周围使用parens,即使它们不是必需的。当我使用parens时,我永远不必查询AND或OR是否优先,因为它并不重要,因为我总是指定优先级。

我帮助读者,并按照以下格式编写我的SQL:

WHERE ( pp.project_leader  = Project_Leader  OR Project_Leader   IS NULL )
  AND ( pp.rd_plan         = RD_Plan         OR RD_Plan          IS NULL )
  AND ( pp.approval_status = Approval_Status OR Approval_Status  IS NULL )
  AND ( pp.design_plan     = Design_Plan     OR Design_Plan      IS NULL )

这样,每一行都是"检查"单个列的启用(启用非NULL值)或禁用NULL值。

真的只是个人喜好,我觉得这种方式更容易阅读,即使行数稍微长一些,我还是要检查所有的一行。

同样,不需要局部变量。

但是,您可以将局部变量设置为等于参数值,然后在SQL语句中引用局部变量。当变量与列具有相同名称时,这确实有帮助,因为如果它们的名称相同,那么MySQL将假设它是对列名的引用而不是变量名。使用局部变量可以让您重命名它,这样就不会与列名混淆。

<强>更新

我刚注意到参数变量名称与列名相同,这将是一个问题。

您希望变量名称与列名称不同。您希望确保变量的数据类型与列匹配...稍后,当您将列从VARCHAR(15)更改为VARCHAR(30)时,您需要重新访问该过程并更改过程参数以及局部变量。

BEGIN
   -- local variable names are DISTINCT from any column name
   -- in any table referenced by a query these are used in
   DECLARE ps_Project_Leader  VARCHAR(15);
   DECLARE ps_RD_Plan         VARCHAR(15);
   ...

   -- copy parameter values to local variables
   SET ps_Project_Leader = Project_Leader  ;
   SET ps_RD_Plan        = RD_Plan         ;
   ...

   -- query references local variable names 
   ...
    WHERE ( pp.project_leader  = ps_Project_Leader  OR ps_Project_Leader   IS NULL )
      AND ( pp.rd_plan         = ps_RD_Plan         OR ps_RD_Plan          IS NULL )
   ...