1

我对存储过程和函数之间的差异有点模糊。我有一个包含数据表,其他细节当中,下面的名称字段雇员目录数据库:MySQL存储过程或函数以特定格式返回一个人的名字

first_name, varchar(45) 
mi, char(3) 
last_name, varchar(45) 
suffix, varchar(10) 

我希望能够有一个函数/过程中

返回全名LAST_NAME后缀如first_name英里

格式,其中括号中的字段是NULL可选在表中。我可以

SELECT last_name, suffix, first_name, mi from employee; 

构建在PHP中格式化名称字符串,然后用一系列条件语句来测试空后缀和MI领域。但是,我想能够使用SQL语句像

SELECT getDisplayName() WHERE last_name LIKE '%Smith%'; 

返回像

结果
Smith III, John Q 
Smith, Susanne L 
Smithers, Waylon 

有人点我在正确的方向,或者至少告诉我,如果我需要一个函数或过程?

谢谢。

回答

1

您可以使用此功能:

DROP FUNCTION IF EXISTS getDisplayName; 
DELIMITER $$ 
CREATE FUNCTION getDisplayName(last_name text, suffix text, first_name text, mi text) 
    RETURNS TEXT 
BEGIN 
    DECLARE name text; 
    SET name = ''; 
    IF last_name IS NOT NULL THEN 
     SET name = last_name; 
    END IF; 

    IF suffix IS NOT NULL THEN 
     SET name = CONCAT(name, ' ', suffix); 
    END IF; 

    IF first_name IS NOT NULL THEN 
     SET name = CONCAT(name, ', ', first_name); 
    END IF; 

    IF mi IS NOT NULL THEN 
     SET name = CONCAT(name, ' ', mi); 
    END IF; 

    RETURN name; 
END; 
$$ 
DELIMITER ; 

所以你的选择会是这样的:

SELECT getDisplayName(last_name, suffix, first_name, mi) FROM employee WHERE last_name LIKE '%Smith%'; 
+0

完美的作品,谢谢。 有没有一种方法可以得到相同的结果而不必指定四个参数?或者它是一个范围问题,如果我不将变量赋予函数,则无法访问它们? – user208145

+0

你是对的“它是一个范围问题,如果我不给变量的功能,它不能访问它们” –

+1

太好了,谢谢@alexander。再次感谢该功能。我不得不稍微调整它,因为“IS NOT NULL”与空字符串不同。不过这是一个很好的开始。 – user208145