2013-05-15 58 views
0

我有一個簡單的表:如何在MySQL中獲取姓名首字母縮寫?

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完成? 我是否應該爲此寫入存儲函數,或者有沒有更簡單的方法?

問候。

+2

是的,需要一個功能。看看:http://stackoverflow.com/questions/9301081/get-the-first-letter-of-each-word-in-a-sql-string –

+2

你可以看看字符串函數,看看'substr','locate'和/或'substring_index'有多遠? http://dev.mysql.com/doc/refman/5.0/en/string-functions.html – Nanne

+0

@Nanne感謝您的鏈接。 – BlitZ

回答

4

你可以使用這樣的查詢:

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 

請參閱小提琴here。該查詢最多支持四個名稱。

+0

我喜歡你的方法,但實際上有很多地方,如果我使用它,我需要更正代碼。我已經提出了你的答案。謝謝你的時間。 – BlitZ

+0

好的,無論我的解決方案如何,我完全同意,在大多數情況下,您的答案更容易適用。接受,爲未來的訪客。再次感謝。我甚至不知道,這是可能的直接查詢沒有存儲功能。 – BlitZ

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 

經過與:

,並得到以下結果:

'Ivanov I. I.' 
'Alym k. A.' 
0
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.Execute在MySQL這個功能。 2.這將創建一個功能。現在,您可以在任何需要的地方使用此功能。

SELECT `getNameInitials`('Kaleem Ul Hassan', ' ') AS `NameInitials`; 
  • 上面getNameInitails第一個參數是要過濾和第二是在其上要你分開字符串觀戰字符串。 4.在上面的例子中,'Kaleem Ul Hassan'是名字,我想要首字母縮寫,我的分隔符是空格''。
  • 相關問題