Heim >Datenbank >MySQL-Tutorial >Wie kann ich Vor-, Zweit- und Nachnamen aus einem einzigen Feld für den vollständigen Namen in SQL analysieren?

Wie kann ich Vor-, Zweit- und Nachnamen aus einem einzigen Feld für den vollständigen Namen in SQL analysieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-30 00:09:18536Durchsuche

How Can I Parse First, Middle, and Last Names from a Single Full Name Field in SQL?

Vor-, Mittel- und Nachnamen aus einem Feld mit vollständigem Namen in SQL analysieren

Einführung

Diese Diskussion dreht sich um eine häufige Herausforderung in der Datenverarbeitung: das Extrahieren von Vor-, Mittel- und Nachnamen aus einem einzigen Vollnamenfeld mithilfe von SQL. In diesem Artikel werden praktische Lösungen untersucht, die darauf abzielen, 90 % der typischen Fälle zu bewältigen.

Methode

Die vorgeschlagene Methode umfasst eine verschachtelte Reihe von Unterabfragen, die das Feld „Vollständiger Name“ aufschlüsseln in seine Einzelteile zerlegen. Es wird davon ausgegangen, dass der vollständige Name als „Vorname, mittlerer Nachname“ formatiert ist, wobei der zweite Vorname optional ist.

Beispiele

Das folgende SQL-Beispiel veranschaulicht den Ansatz:

SELECT
  FIRST_NAME.ORIGINAL_INPUT_DATA
 ,FIRST_NAME.TITLE
 ,FIRST_NAME.FIRST_NAME
 ,CASE WHEN 0 = CHARINDEX(' ',FIRST_NAME.REST_OF_NAME)
       THEN NULL  --no more spaces?  assume rest is the last name
       ELSE SUBSTRING(
                       FIRST_NAME.REST_OF_NAME
                      ,1
                      ,CHARINDEX(' ',FIRST_NAME.REST_OF_NAME)-1
                     )
       END AS MIDDLE_NAME
 ,SUBSTRING(
             FIRST_NAME.REST_OF_NAME
            ,1 + CHARINDEX(' ',FIRST_NAME.REST_OF_NAME)
            ,LEN(FIRST_NAME.REST_OF_NAME)
           ) AS LAST_NAME
FROM
  (  
  SELECT
    TITLE.TITLE
   ,CASE WHEN 0 = CHARINDEX(' ',TITLE.REST_OF_NAME)
         THEN TITLE.REST_OF_NAME --No space? return the whole thing
         ELSE SUBSTRING(
                         TITLE.REST_OF_NAME
                        ,1
                        ,CHARINDEX(' ',TITLE.REST_OF_NAME)-1
                       )
    END AS FIRST_NAME
   ,CASE WHEN 0 = CHARINDEX(' ',TITLE.REST_OF_NAME)  
         THEN NULL  --no spaces @ all?  then 1st name is all we have
         ELSE SUBSTRING(
                         TITLE.REST_OF_NAME
                        ,CHARINDEX(' ',TITLE.REST_OF_NAME)+1
                        ,LEN(TITLE.REST_OF_NAME)
                       )
    END AS REST_OF_NAME
   ,TITLE.ORIGINAL_INPUT_DATA
  FROM
    (   
    SELECT
      --if the first three characters are in this list,
      --then pull it as a "title".  otherwise return NULL for title.
      CASE WHEN SUBSTRING(TEST_DATA.FULL_NAME,1,3) IN ('MR ','MS ','DR ','MRS')
           THEN LTRIM(RTRIM(SUBSTRING(TEST_DATA.FULL_NAME,1,3)))
           ELSE NULL
           END AS TITLE
      --if you change the list, don't forget to change it here, too.
      --so much for the DRY prinicple...
     ,CASE WHEN SUBSTRING(TEST_DATA.FULL_NAME,1,3) IN ('MR ','MS ','DR ','MRS')
           THEN LTRIM(RTRIM(SUBSTRING(TEST_DATA.FULL_NAME,4,LEN(TEST_DATA.FULL_NAME))))
           ELSE LTRIM(RTRIM(TEST_DATA.FULL_NAME))
           END AS REST_OF_NAME
     ,TEST_DATA.ORIGINAL_INPUT_DATA
    FROM
      (
      SELECT
        --trim leading & trailing spaces before trying to process
        --disallow extra spaces *within* the name
        REPLACE(REPLACE(LTRIM(RTRIM(FULL_NAME)),'  ',' '),'  ',' ') AS FULL_NAME
       ,FULL_NAME AS ORIGINAL_INPUT_DATA
      FROM
        (
        --if you use this, then replace the following
        --block with your actual table
              SELECT 'GEORGE W BUSH' AS FULL_NAME
        UNION SELECT 'SUSAN B ANTHONY' AS FULL_NAME
        UNION SELECT 'ALEXANDER HAMILTON' AS FULL_NAME
        UNION SELECT 'OSAMA BIN LADEN JR' AS FULL_NAME
        UNION SELECT 'MARTIN J VAN BUREN SENIOR III' AS FULL_NAME
        UNION SELECT 'TOMMY' AS FULL_NAME
        UNION SELECT 'BILLY' AS FULL_NAME
        UNION SELECT NULL AS FULL_NAME
        UNION SELECT ' ' AS FULL_NAME
        UNION SELECT '    JOHN  JACOB     SMITH' AS FULL_NAME
        UNION SELECT ' DR  SANJAY       GUPTA' AS FULL_NAME
        UNION SELECT 'DR JOHN S HOPKINS' AS FULL_NAME
        UNION SELECT ' MRS  SUSAN ADAMS' AS FULL_NAME
        UNION SELECT ' MS AUGUSTA  ADA   KING ' AS FULL_NAME      
        ) RAW_DATA
      ) TEST_DATA
    ) TITLE
  ) FIRST_NAME

Sonderfälle

Umgang mit Sonderfällen wie fehlenden Werten, Nachgestellte Leerzeichen und Namen mit mehr als drei Teilen können die Genauigkeit der Ergebnisse verbessern.

Fazit

Diese Methode bietet eine solide Grundlage für die Analyse von First, Middle, und Nachnamen aus einem Feld mit vollständigem Namen in SQL, wobei sowohl typische als auch Sonderfälle behandelt werden. Durch die Anpassung der Lösung an spezifische Anforderungen können Sie eine deutliche Verbesserung der Namenszuordnung und Datenanalyseeffizienz erreichen.

Das obige ist der detaillierte Inhalt vonWie kann ich Vor-, Zweit- und Nachnamen aus einem einzigen Feld für den vollständigen Namen in SQL analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn