mysql - MYSQL 触发器中的 CASE 语句
问题描述
关于这个主题的大部分信息似乎都严格地引用了 select 语句。我正在尝试在触发器中实现一些代码。
DECLARE v_fname, v_mname,v_lname,v_suffix, v_position VARCHAR(80);
DECLARE v_name VARCHAR(120);
SELECT first_name, middle_name, last_name, suffix into v_fname, v_mname, v_lname, v_suffix FROM people where objid = NEW.person_id;
SELECT v_fname, v_mname, v_lname, v_suffix,
CASE
WHEN ((v_mname != "" OR v_mname IS NOT NULL) AND (v_suffix != "" OR v_suffix IS NOT NULL)) THEN SET v_name = CONCAT(v_fname,v_mname,v_lname,v_suffix)
WHEN ((v_mname = "" OR v_mname IS NULL) AND (v_suffix != "" OR v_suffix IS NOT NULL)) THEN SET v_name = CONCAT(v_fname, v_lname, v_suffix)
WHEN ((v_mname != "" OR v_mname IS NOT NULL) AND (v_suffix = "" OR v_suffix IS NULL)) THEN SET v_name = CONCAT(v_fname," ",v_mname," ",v_lname)
ELSE SET v_name = CONCAT(v_fname," ",v_lname)
END CASE;
基本目标是清理名称数据并输出连接列表。
问题是名称的某些部分不存在,当CONCAT
遇到NULL
.
我尝试使用 COALESCE 和 CONCAT_WS,但它们没有产生我想要的结果。
结果有4种可能:
Joe J. Jones, Jr
Joe Jones, Jr
Joe J. Jones
Joe Jones
我以前没有使用过 CASE,它似乎是一个优雅的解决方案。
我要回去,IF THEN ELSE
但我很好奇我是否超出了这里的可能。
可能我没有很好地解决这个问题,所以我希望能提供见解或评论来帮助解决我的好奇心。
解决方案
您不应该使用 SET 为列分配值..您只需要选择列,例如:假设您想要结果 v_name 列
SELECT v_fname, v_mname, v_lname, v_suffix,
CASE
WHEN ((v_mname != "" OR v_mname IS NOT NULL)
AND (v_suffix != "" OR v_suffix IS NOT NULL))
THEN CONCAT(v_fname,v_mname,v_lname,v_suffix)
WHEN ((v_mname = "" OR v_mname IS NULL)
AND (v_suffix != "" OR v_suffix IS NOT NULL))
THEN CONCAT(v_fname, v_lname, v_suffix)
WHEN ((v_mname != "" OR v_mname IS NOT NULL)
AND (v_suffix = "" OR v_suffix IS NULL))
THEN CONCAT(v_fname," ",v_mname," ",v_lname)
ELSE CONCAT(v_fname," ",v_lname) as v_name
END CASE;
推荐阅读
- computation-theory - 在非确定性有限自动机 (NFA) 中,当有两个或多个转换时,如何选择下一个分支/转换?
- r - 考虑R中数据框中的条件提取行
- reactjs - 在搜索框中过滤表情符号
- php - 准备好的语句停止写入 MySQL 表
- python - Python Tkinter 从文本小部件输出导入数据
- lightgbm - 使用 LightGBM 交叉验证时缩放数据
- windows - 如何在没有加密密钥的情况下禁用 8.1 中的锁定文件
- kubernetes - 在 Kubernetes 中为蝗虫挂载大于 3 MB 的文本文件
- ios - 在 ios 上使用 videojs 播放 MKV 视频
- c# - 在 OnMembersAddedAsync 中使用 member.Id != turnContext.Activity.Recipient.Id?