我最近能够生成一个过程,如果未设置变量,我可以将其设置为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个,我不希望它搜索尚未设置的变量。
非常感谢,如果我没有完全理解(我是新手,所以我很抱歉)我很乐意清理。
答案 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 )
...