MYSQL如果参数为null则设置

use*_*471 0 mysql sql stored-procedures

我是MYSQL的新手,但对SQL有基本的了解,我想说的是,如果我的参数没有设置(即null),那么将其设置为JM。

下面的脚本我出了什么问题/哪里出了问题?

提前致谢

CREATE DEFINER=`james`@`%` PROCEDURE `Project_Status`(IN engineer VARCHAR (5))
BEGIN

SELECT 
    PP.pid_full,
    PP.description_small,
    PP.project_status,
    PP.est_comp_date as 'Est Comp Date',
    EP.engineer
FROM 
    project_pid pp
JOIN
    eng_project_hours EP on PP.pid_full = EP.pid_full

where engineer = ep.engineer;

IF engineer is null then update engineer = jm
set engineer = ep.engineer;
end if;

end
Run Code Online (Sandbox Code Playgroud)

spe*_*593 5

我不确定我明白你想做什么。

如果您想要使用 的值,'JM'而不是NULL当输入参数的值为 时NULL,实现这种行为的一种方法是在过程中声明一个局部变量。

检查参数的值,并相应设置局部变量的值;当输入参数为 null 时,将局部变量设置为文字值'JM';当输入参数不为 null 时,将局部变量设置为输入参数的值。然后在SQL语句中引用局部变量。

像这样的东西:

DELIMITER $$

CREATE DEFINER=`james`@`%` PROCEDURE `Project_Status`(IN engineer VARCHAR(5))
BEGIN

   DECLARE ls_engineer VARCHAR(5);
   SET ls_engineer = IFNULL(engineer,'JM');

   SELECT pp.pid_full
        , pp.description_small
        , pp.project_status
        , pp.est_comp_date as 'Est Comp Date'
        , ep.engineer
     FROM project_pid pp
     JOIN eng_project_hours ep
        ON pp.pid_full = ep.pid_full
     WHERE ep.engineer = ls_engineer ;
END$$
Run Code Online (Sandbox Code Playgroud)

请注意:

   SET ls_engineer = IFNULL(engineer,'JM');
Run Code Online (Sandbox Code Playgroud)

更容易阅读的简写相当于:

   IF ( engineer IS NULL ) THEN
      SET ls_engineer = 'JM';
   ELSE
      SET ls_engineer = engineer;
   END IF;
Run Code Online (Sandbox Code Playgroud)

跟进

问:例如,如果我有“JM”,我希望程序选择所有记录,这是可以在其中完成的事情吗?

答:是的。比方说,例如,如果输入参数具有“特殊值” 'JM',您根本不希望对该ep.engineer列进行任何限制,您可以通过向 WHERE 子句添加 OR 条件来调整查询...

WHERE ep.engineer = ls_engineer
   OR engineer = 'JM'
Run Code Online (Sandbox Code Playgroud)

如果输入参数engineer的值为'JM',则 is 后面的谓词OR将为所有行返回 TRUE,因此无论其之前的部分返回ORTRUE、FALSE 还是 NULL,WHERE 子句的总体结果都是所有行都为 TRUE。

但我建议这NULL比作为输入参数的特殊“返回所有行”值更合适'JM',不需要输入参数的“默认”值,即不需要将 NULL 转换为'JM'. 但这实际上取决于您的用例,但您可能会考虑JM完全绕过默认值,并在查询中执行类似以下操作:

WHERE ep.engineer = engineer
   OR engineer IS NULL
Run Code Online (Sandbox Code Playgroud)

问:前缀的原因/含义是什么ls_

A:

ls_前缀只是我从 Oracle PL/SQL 时代起就使用的匈牙利风格表示法;我只是发现它是一种方便的方法,可以帮助跟踪范围,并使变量名称不与其他变量名称或 SQL 中的列名称冲突。

在 SQL 语句中,我可以限定列名以避免歧义,但无法限定变量(除了使用绑定参数之外)。

我可以定义一个与全局变量同名的局部变量,而我的局部变量会覆盖(隐藏)全局变量,这通常不是我想要的。

我不太喜欢匈牙利表示法,尤其是 Windows 风格lpszFoohwndBar,但匈牙利表示法在 Oracle PL/SQL 中对我来说很方便。

我使用第一个字母来标识变量的范围,“l”表示本地,“g”表示全局,“a”表示参数。下一个字母是变量数据类型的简写,“s”表示 VARCHAR(字符串)类型,“d”表示 DATE,“n”表示 NUMBER。

因此,“as_”是一个参数字符串,“ld_”是本地日期,等等。

跟踪数据类型对于避免 SQL 中意外的隐式数据转换非常重要,并且可以进行看起来“错误”的错误显式转换,例如不需要围绕“日期”使用 TO_DATE() 或围绕数字使用 TO_NUMBER,但需要将字符串转换为数字等。