关于这个主题的大多数信息似乎都严格地引用了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;