0

我有一个简单的表:

id | fullname
---------------------------
 1 | Ivanov Ivan Ivanovich
---------------------------
 2 | Petrov Petr Petrovich
---------------------------
 3 | Alym kyzy Ainura

我需要将它们转换成这样的东西:

id | name_initials
--------------------
 1 | Ivanov I. I.
--------------------
 2 | Petrov P. P.
--------------------
 3 | Alym k. A.

我可以通过 PHP 轻松实现,但 MySQL 是关于数据操作的。我认为,它可能(并且必须)仅使用 DBMS 完成。

如何通过纯 SQL 来完成?我应该为此编写存储函数,还是有更短的方法?

问候。

4

3 回答 3

5

您可以使用这样的查询:

SELECT
  fullname,
  CONCAT_WS(' ',
    SUBSTRING_INDEX(fullname, ' ', 1),
    CASE WHEN LENGTH(fullname)-LENGTH(REPLACE(fullname,' ',''))>2 THEN
      CONCAT(LEFT(SUBSTRING_INDEX(fullname, ' ', -3), 1), '.')
    END,
    CASE WHEN LENGTH(fullname)-LENGTH(REPLACE(fullname,' ',''))>1 THEN
      CONCAT(LEFT(SUBSTRING_INDEX(fullname, ' ', -2), 1), '.')
    END,
    CASE WHEN LENGTH(fullname)-LENGTH(REPLACE(fullname,' ',''))>0 THEN
      CONCAT(LEFT(SUBSTRING_INDEX(fullname, ' ', -1), 1), '.')
    END) shortname
FROM
  Names

在此处查看小提琴。此查询最多支持四个名称。

于 2013-05-15T10:22:28.137 回答
1

用存储函数解决:

CREATE FUNCTION `getNameInitials`(`fullname` VARCHAR(70))
RETURNS VARCHAR(70)
DETERMINISTIC
BEGIN
DECLARE `result` VARCHAR(70) DEFAULT '';
DECLARE `position` TINYINT;

DECLARE `separator` VARCHAR(1) DEFAULT ' ';
DECLARE `append` VARCHAR(1) DEFAULT '.';

DECLARE `buffer` VARCHAR(10);

SET `fullname` = CONCAT(TRIM(`fullname`), `separator`);
SET `position` = LOCATE(`separator`, `fullname`);

IF NOT `position`
THEN RETURN TRIM(`fullname`);
END IF;

SET `result`   = LEFT(`fullname`, `position` - 1);

cycle: LOOP
    SET `fullname` = SUBSTR(`fullname`, `position` + 1);
    SET `position` = LOCATE(`separator`, `fullname`);

    IF NOT `position` OR NOT LENGTH(`fullname`)
    THEN LEAVE cycle;
    END IF;

    SET `buffer` = CONCAT(LEFT(`fullname`, 1), `append`);
    SET `result` = CONCAT_WS(`separator`, `result`, `buffer`);
END LOOP cycle;

RETURN `result`;
END

检查:

SELECT
    getNameInitials(`fullname`) as `name`
FROM
    (
    SELECT
        'Ivanov Ivan Ivanovich' as `fullname`
    UNION ALL
        SELECT 'Alym kyzy Ainura'
    ) `sub`;

并得到以下结果:

'Ivanov I. I.'
'Alym k. A.'
于 2013-05-15T11:42:30.013 回答
1
CREATE DEFINER=`root`@`localhost` FUNCTION `getNameInitials`(`fullname` VARCHAR(500), `separator` VARCHAR(1)) RETURNS varchar(70) CHARSET latin1
    DETERMINISTIC
BEGIN
DECLARE `result` VARCHAR(500) DEFAULT '';
DECLARE `position` TINYINT;



SET `fullname` = TRIM(`fullname`);

SET `position` = LOCATE(`separator`, `fullname`);

IF NOT `position`
THEN RETURN LEFT(`fullname`,1);
END IF;

SET `fullname` = CONCAT(`fullname`,`separator`);
SET `result` = LEFT(`fullname`, 1);

cycle: LOOP
    SET `fullname` = SUBSTR(`fullname`, `position` + 1);
    SET `position` = LOCATE(`separator`, `fullname`);

    IF NOT `position` OR NOT LENGTH(`fullname`)
    THEN LEAVE cycle;
    END IF;

    SET `result` = CONCAT(`result`,LEFT(`fullname`, 1));
   -- SET `result` = CONCAT_WS(`separator`, `result`, `buffer`);
END LOOP cycle;

RETURN upper(`result`);
END

1.在mysql中执行这个函数。2.这将创建一个函数。现在你可以在任何你想要的地方使用这个功能。

 SELECT `getNameInitials`('Kaleem Ul Hassan', ' ') AS `NameInitials`;
  1. 上面的 getNameInitails 第一个参数是要过滤的字符串,第二个参数是要分隔字符串的旁观者角色。4. 在上面的例子中,'Kaleem Ul Hassan' 是名字,我想得到首字母,我的分隔符是空格''。
于 2016-10-09T04:45:04.070 回答