Хранимая процедура или функция MySQL для возврата имени человека в определенном формате

Я немного не понимаю разницы между хранимыми процедурами и функциями. У меня есть база данных каталога сотрудников с таблицей данных, содержащей, среди прочего, следующие поля имен:

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

Я хотел бы, чтобы функция/процедура возвращала полное имя в

фамилия (суффикс), имя (ми)

формат, где поля в круглых скобках являются необязательными в таблице. Я могу построить отформатированную строку имени в PHP с помощью

SELECT last_name, suffix, first_name, mi from employee;

, затем используйте ряд условных выражений для проверки пустых суффиксов и полей mi. Но я хотел бы иметь возможность использовать оператор SQL, например

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

чтобы вернуть результат, например

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

Может ли кто-нибудь указать мне правильное направление или, по крайней мере, сказать мне, нужна ли мне функция или процедура?

Спасибо.


person user208145    schedule 03.03.2016    source источник


Ответы (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%';
person alexander.polomodov    schedule 03.03.2016
comment
Работает отлично, спасибо. Есть ли способ получить тот же результат без указания четырех параметров? Или это проблема области, где, если я не передам переменные функции, она не сможет получить к ним доступ? - person user208145; 03.03.2016
comment
Вы правы, это проблема с областью действия, когда, если я не передам переменные функции, она не сможет получить к ним доступ. - person alexander.polomodov; 03.03.2016
comment
Отлично, спасибо @alexander. Еще раз спасибо за функцию. Мне нужно немного изменить его, потому что IS NOT NULL — это не то же самое, что пустая строка. Хотя это отличное начало. - person user208145; 04.03.2016