gpt4 book ai didi

MYSQL如果参数为空则设置

转载 作者:太空宇宙 更新时间:2023-11-03 10:53:19 24 4
gpt4 key购买 nike

我是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

最佳答案

我不确定我是否理解您的意图。

当输入参数的值为 NULL 时,如果您想使用 'JM' 的值而不是 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$$

请注意:

   SET ls_engineer = IFNULL(engineer,'JM');

是更容易阅读的速记,等同于:

   IF ( engineer IS NULL ) THEN
SET ls_engineer = 'JM';
ELSE
SET ls_engineer = engineer;
END IF;

跟进

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

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

WHERE ep.engineer = ls_engineer
OR engineer = 'JM'

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

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

WHERE ep.engineer = engineer
OR engineer IS NULL

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

答:

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

在 SQL 语句中,我可以限定列名以避免歧义,但是没有办法限定变量(除了使用绑定(bind)参数)。

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

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

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

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

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

关于MYSQL如果参数为空则设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22770227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com