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

ここでフィドルを参照してください。このクエリは、最大 4 つの名前をサポートします。

于 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 の最初のパラメーターはフィルター処理する文字列で、2 番目は文字列を区切るスペクテーター文字です。4. 上記の例では、'Kaleem Ul Hassan' が名前で、イニシャルを取得したいのですが、セパレーターはスペース ' ' です。
于 2016-10-09T04:45:04.070 に答える