首页 > 解决方案 > 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但我很好奇我是否超出了这里的可能。

可能我没有很好地解决这个问题,所以我希望能提供见解或评论来帮助解决我的好奇心。

标签: mysqlmysql-error-1064

解决方案


您不应该使用 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;

推荐阅读