Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中从fullname获取首字母?_Mysql_String - Fatal编程技术网

如何在MySQL中从fullname获取首字母?

如何在MySQL中从fullname获取首字母?,mysql,string,Mysql,String,我有一张简单的桌子: id | fullname --------------------------- 1 | Ivanov Ivan Ivanovich --------------------------- 2 | Petrov Petr Petrovich --------------------------- 3 | Alym kyzy Ainura 我需要把它们转换成这样的东西: id | name_initials -------------------- 1 | Iva

我有一张简单的桌子:

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.
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
我可以通过PHP轻松实现,但MySQL是关于数据操作的。我认为,它可能(而且必须)只使用DBMS完成

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


注意。

您可以使用如下查询:

id | name_initials
--------------------
 1 | Ivanov I. I.
--------------------
 2 | Petrov P. P.
--------------------
 3 | Alym k. A.
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

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

您可以使用如下查询:

id | name_initials
--------------------
 1 | Ivanov I. I.
--------------------
 2 | Petrov P. P.
--------------------
 3 | Alym k. A.
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

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

使用存储函数解决:

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.'

使用存储函数解决:

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.'
1.在mysql中执行此功能。2.这将创建一个函数。现在,您可以在任何地方使用此功能

 SELECT `getNameInitials`('Kaleem Ul Hassan', ' ') AS `NameInitials`;
  • 上面的getNameInitails第一个参数是要筛选的字符串,第二个参数是要分离字符串的旁观者字符。4.在上面的示例中,“Kaleem Ul Hassan”是名称,我想得到首字母缩写,分隔符是空格“”
  • 1.在mysql中执行此功能。2.这将创建一个函数。现在,您可以在任何地方使用此功能

     SELECT `getNameInitials`('Kaleem Ul Hassan', ' ') AS `NameInitials`;
    
  • 上面的getNameInitails第一个参数是要筛选的字符串,第二个参数是要分离字符串的旁观者字符。4.在上面的示例中,“Kaleem Ul Hassan”是名称,我想得到首字母缩写,分隔符是空格“”

  • 是的,需要一个函数。查看:您可以查看字符串函数,并查看使用
    substr
    locate
    和/或
    substring\u index
    @Nanne感谢您的链接。@Andrius Naruševičius感谢您的意见/最后的论点。@towi什么时候与MS SQL Server相关的问题等同于MySQL服务器的问题了?您能指定吗?是的,需要一个函数。查看:您可以查看字符串函数,并查看使用
    substr
    locate
    和/或
    substring\u index
    @Nanne感谢您的链接。@Andrius Naruševičius感谢您的意见/最后的论点。@towi什么时候与MS SQL Server相关的问题等同于MySQL服务器的问题了?你能具体说明一下吗?我喜欢你的方法,但如果我使用它的话,确实有很多地方需要更正代码。我对你的答案投了赞成票。谢谢你的时间。好吧,不管我的解决方案如何,我完全同意,你的答案在大多数情况下更容易适用。已接受,供未来访客使用。再次感谢。我甚至不知道,这在没有存储函数的直接查询中是可能的。我喜欢你的方法,但如果我使用它,确实有很多地方需要更正代码。我对你的答案投了赞成票。谢谢你的时间。好吧,不管我的解决方案如何,我完全同意,你的答案在大多数情况下更容易适用。已接受,供未来访客使用。再次感谢。我甚至不知道,这在没有存储函数的直接查询中是可能的。