如何在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`;
SELECT `getNameInitials`('Kaleem Ul Hassan', ' ') AS `NameInitials`;
是的,需要一个函数。查看:您可以查看字符串函数,并查看使用
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服务器的问题了?你能具体说明一下吗?我喜欢你的方法,但如果我使用它的话,确实有很多地方需要更正代码。我对你的答案投了赞成票。谢谢你的时间。好吧,不管我的解决方案如何,我完全同意,你的答案在大多数情况下更容易适用。已接受,供未来访客使用。再次感谢。我甚至不知道,这在没有存储函数的直接查询中是可能的。我喜欢你的方法,但如果我使用它,确实有很多地方需要更正代码。我对你的答案投了赞成票。谢谢你的时间。好吧,不管我的解决方案如何,我完全同意,你的答案在大多数情况下更容易适用。已接受,供未来访客使用。再次感谢。我甚至不知道,这在没有存储函数的直接查询中是可能的。