2017-10-17 56 views
3

我如何获得不是第一个也不是最后一个的名字?如何获取不是第一个和最后一个的名字?

示例 - 名称:

Pablo Diego José Francisco 
Juan Nepomuceno María de los Remedios 
Daniel Mayes Matthew da Kitching 
Ben Wignall Elizabeth de Hann 
Emma Simpson Liam Wales Jacob 

我想有结果如下图所示:

First_name Middle_Name  Last_Name 
---------------------------------------- 
Pablo  Diego José   Francisco 
Juan  Nepomuceno María Remedios 
Daniel  Mayes Matthew  Kitching 
Ben   Wignall Elizabeth Hann 
Emma  Simpson Liam Wales Jacob 

对于中间名,规则是:我想以后把所有的名字第一个名字,最后一个名字之前,但是当发生像“de los”或“de”或“da”这样的小名字时,我不想展示它。

+0

首先你^ h大街确定准确的标准,你不想作为一个名字,那么你可以想出如何去做 –

回答

3

这一种可能性......

DECLARE @t TABLE(
    Name varchar(200) 
) 

INSERT INTO @t VALUES 
    ('Pablo Diego José Francisco') 
,('Juan Nepomuceno María de los Remedios') 
,('Daniel Mayes Matthew da Kitching') 
,('Ben Wignall Elizabeth de Hann') 
,('Emma Simpson Liam Wales Jacob'); 


WITH cte AS(
    SELECT Name, REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(t.Name)),' de ', ' '), ' da ', ' '), ' los ', ' ') NameShort, REVERSE(REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(t.Name)),' de ', ' '), ' da ', ' '), ' los ', ' ')) NameShortRev 
    FROM @t t 
) 
SELECT c.Name, c.NameShort 
     ,LEFT(c.NameShort, CHARINDEX(' ', c.NameShort)) FirstName 
     ,SUBSTRING(c.NameShort, CHARINDEX(' ', c.NameShort) + 1, LEN(c.NameShort) - CHARINDEX(' ', c.NameShortRev) - CHARINDEX(' ', c.NameShort)) MiddleName 
     ,REVERSE(LEFT(c.NameShortRev, CHARINDEX(' ', c.NameShortRev))) LastName 
    FROM cte c 

结果:

Name         NameShort      FirstName MiddleName   LastName 
Pablo Diego José Francisco    Pablo Diego José Francisco  Pablo  Diego José   Francisco 
Juan Nepomuceno María de los Remedios Juan Nepomuceno María Remedios Juan  Nepomuceno María Remedios 
Daniel Mayes Matthew da Kitching  Daniel Mayes Matthew Kitching Daniel  Mayes Matthew  Kitching 
Ben Wignall Elizabeth de Hann   Ben Wignall Elizabeth Hann  Ben   Wignall Elizabeth Hann 
Emma Simpson Liam Wales Jacob   Emma Simpson Liam Wales Jacob Emma  Simpson Liam Wales Jacob 
+0

“即,没有本地的方式来做到这一点”? – Blacksilver

+0

查看我的回答@Blacksilver – wast

+0

我不太了解SQL,所以你将不得不回答这个问题;) – Blacksilver

1

试试这个,

DECLARE @TABLE_NAME TABLE (NAME NVARCHAR(200)) 

INSERT INTO @TABLE_NAME 
VALUES ('Pablo Diego José Francisco'), 
    ('Juan Nepomuceno María de los Remedios'), 
    ('Daniel Mayes Matthew da Kitching'), 
    ('Ben Wignall Elizabeth de Hann'), 
    ('Emma Simpson Liam Wales Jacob') 

SELECT RTRIM(LEFT(NEW_NAME,START_POS)) AS First_name, 
     SUBSTRING(NEW_NAME,START_POS+1, LEN(NEW_NAME)-START_POS - END_POS) AS Middle_Name , 
     LTRIM(RIGHT(NEW_NAME,END_POS)) AS Last_Name 
FROM (
    SELECT NAME 
      ,REPLACE(REPLACE(REPLACE(LTRIM(RTRIM(NAME)),' de ', ' '), ' da ', ' '), ' los ', ' ') NEW_NAME 
      ,CHARINDEX(' ',NAME) AS START_POS 
      ,CHARINDEX(' ', REVERSE(NAME)) AS END_POS 
    FROM @TABLE_NAME 
) AS T 
0

较长的回答在这里:)

首先,我们创建一个function那从给定的字符串中移除具有3个或更少字符的单词(在我们的例子中将是中间名)。

DROP FUNCTION IF EXISTS `func_Remove_ShortStrings`; 
CREATE FUNCTION `func_Remove_ShortStrings`(InStr LONGTEXT) RETURNS LONGTEXT 
    DETERMINISTIC 
BEGIN 
    DECLARE RetStr LONGTEXT DEFAULT ""; 
    DECLARE TempStr LONGTEXT DEFAULT ""; 
    DECLARE aWord LONGTEXT DEFAULT ""; 
    DECLARE WordLength INT DEFAULT 0; 
    SET TempStr = TRIM(InStr); 
    WHILE (LENGTH(TempStr) > 0) DO 
     SET aWord = SUBSTRING_INDEX(TempStr, " ", 1); 
     SET WordLength = LENGTH(aWord); 
     IF (WordLength > 3) THEN 
      SET RetStr = CONCAT(RetStr, " ", aWord); 
     END IF; 
     SET TempStr = TRIM(SUBSTRING(TempStr, WordLength + 1)); 
    END WHILE; 

    return TRIM(RetStr); 
END; 

程序一种方式来获得我们的名字。

DROP PROCEDURE IF EXISTS `splitNames`; 
CREATE PROCEDURE `splitNames`(IN fullname varchar(150)) 
BEGIN  
    DECLARE First_name varchar(40); 
    DECLARE Middle_Name varchar(60); 
    DECLARE Last_Name varchar(50); 

    SET First_name = LEFT(fullname,LOCATE(' ',fullname)); 
    SET Last_Name = RIGHT(fullname,LOCATE(' ',REVERSE(fullname))); 
    SET Middle_Name = TRIM(LEADING First_name FROM fullname); 
    SET Middle_Name = TRIM(TRAILING Last_Name FROM Middle_Name); 
    SET Middle_Name = func_Remove_ShortStrings(Middle_Name); 

    SELECT First_name, TRIM(Middle_Name) Middle_Name, TRIM(Last_Name) Last_Name; 
END; 

CALL splitNames("Ben Wignall Elizabeth de Hann"); 

结果:

First_name  Middle_Name   Last_Name 
Ben    Wignall Elizabeth Hann 

这与功能的方式。仍然需要删除短语的功能。

DROP FUNCTION IF EXISTS getFirstName; 
CREATE FUNCTION getFirstName(fullname VARCHAR(150)) RETURNS varchar(50) 
BEGIN 
    RETURN LEFT(fullname,LOCATE(' ',fullname)); 
END; 

DROP FUNCTION IF EXISTS getLastName; 
CREATE FUNCTION getLastName(fullname VARCHAR(150)) RETURNS varchar(50) 
BEGIN 
    RETURN TRIM(RIGHT(fullname,LOCATE(' ',REVERSE(fullname)))); 
END; 

DROP FUNCTION IF EXISTS getMiddleName; 
CREATE FUNCTION getMiddleName(fullname VARCHAR(150)) RETURNS varchar(50) 
BEGIN 
    DECLARE First_name varchar(40); 
    DECLARE Middle_Name varchar(60); 
    DECLARE Last_Name varchar(50); 

    SET First_name = getFirstName(fullname); 
    SET Last_Name = getLastName(fullname); 
    SET Middle_Name = TRIM(LEADING First_name FROM fullname); 
    SET Middle_Name = TRIM(TRAILING Last_Name FROM Middle_Name); 
    RETURN func_Remove_ShortStrings(Middle_Name); 
END; 

SELECT getFirstName("Ben Wignall Elizabeth de Hann") firstName 
, getMiddleName("Ben Wignall Elizabeth de Hann") middleName 
, getLastName("Ben Wignall Elizabeth de Hann") lastName; 
1

您可以使用CTELEFT()RIGHT()SUBSTRING()功能:

DECLARE @T TABLE (Name NVARCHAR(MAX)); 

INSERT INTO @T VALUES 
('Pablo Diego José Francisco'), 
('Juan Nepomuceno María de los Remedios'), 
('Daniel Mayes Matthew da Kitching'), 
('Ben Wignall Elizabeth de Hann'), 
('Emma Simpson Liam Wales Jacob'); 

With C as(
SELECT NAME, 
     LEFT(Name, CHARINDEX(' ', Name, 1)) As First_name, 
     RIGHT(Name, CHARINDEX(' ', REVERSE(Name), 1)) As Last_Name 
FROM @T) 
    SELECT C.First_name, 
      REPLACE(SUBSTRING(C.Name, LEN(C.First_name)+1, LEN(C.Name)) , C.Last_Name, '') As Middle_Name, 
      C.Last_Name 
    FROM C; 

结果:

+------------+--------------------------+------------+ 
| First_name |  Middle_Name  | Last_Name | 
+------------+--------------------------+------------+ 
| Pablo  | Diego José    | Francisco | 
| Juan  | Nepomuceno María de los | Remedios | 
| Daniel  | Mayes Matthew da  | Kitching | 
| Ben  | Wignall Elizabeth de | Hann  | 
| Emma  | Simpson Liam Wales  | Jacob  | 
+------------+--------------------------+------------+ 

Demo

相关问题