sql >> データベース >  >> RDS >> Sqlserver

SQL:フルネームフィールドから名、ミドルネーム、ラストネームを解析します

    これは、簡単に操作できるテストデータを使用した自己完結型の例です。

    この例では、3つ以上の部分からなる名前がある場合、すべての「余分な」ものがLAST_NAMEフィールドに入れられます。 「DR」、「MRS」、「MR」など、「タイトル」として識別される特定の文字列には例外があります。

    ミドルネームが欠落している場合は、FIRST_NAMEとLAST_NAMEを取得するだけです(MIDDLE_NAMEはNULLになります)。

    それをSUBSTRINGの巨大なネストされたブロブに粉砕することもできますが、SQLでこれを行う場合と同様に、読みやすさは十分に困難です。

    編集-次の特殊なケースを処理します:

    1-NAMEフィールドはNULLです

    2-NAMEフィールドには先頭/末尾のスペースが含まれます

    3-NAMEフィールドには、名前内に1つ以上の連続したスペースがあります

    4-NAMEフィールドには名のみが含まれます

    5-読みやすくするために、元のフルネームを別の列として最終出力に含めます

    6-プレフィックスの特定のリストを個別の「タイトル」列として処理します

    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
    


    1. MySQLで列の照合を表示する方法

    2. Plan Explorer 3.0ウェビナー–サンプルとQ&A

    3. サブクエリと結合

    4. MySQLとMariaDBのセキュリティを実現するための10のヒント