digstarian

SQL salutation, forename, surname splitter FUNCTION

Jun 26th, 2013
1,235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 3.42 KB | None | 0 0
  1. CREATE FUNCTION NameSplitter
  2.     (
  3.         @name nvarchar(100)
  4.     )
  5. RETURNS
  6.     @names TABLE(
  7.         name nvarchar(100),
  8.         salutation nvarchar(100),
  9.         forename nvarchar(100),
  10.         middle_name nvarchar(100),
  11.         surname nvarchar(100)
  12.     )
  13. AS BEGIN
  14.  
  15.     INSERT INTO @names
  16.     SELECT
  17.       FIRST_NAME.ORIGINAL_INPUT_DATA name
  18.      ,FIRST_NAME.SALUTATION salutation
  19.      ,FIRST_NAME.FIRST_NAME forename
  20.      ,CASE WHEN 0 = CHARINDEX(' ',FIRST_NAME.REST_OF_NAME)
  21.            THEN NULL  --no more spaces?  assume rest is the last name
  22.            ELSE SUBSTRING(
  23.                            FIRST_NAME.REST_OF_NAME
  24.                           ,1
  25.                           ,CHARINDEX(' ',FIRST_NAME.REST_OF_NAME)-1
  26.                          )
  27.            END AS middle_name
  28.      ,SUBSTRING(
  29.                  FIRST_NAME.REST_OF_NAME
  30.                 ,1 + CHARINDEX(' ',FIRST_NAME.REST_OF_NAME)
  31.                 ,LEN(FIRST_NAME.REST_OF_NAME)
  32.                ) AS surname
  33.     FROM
  34.       (  
  35.       SELECT
  36.         TITLE.SALUTATION
  37.        ,CASE WHEN 0 = CHARINDEX(' ',TITLE.REST_OF_NAME)
  38.              THEN TITLE.REST_OF_NAME --No space? return the whole thing
  39.              ELSE SUBSTRING(
  40.                              TITLE.REST_OF_NAME
  41.                             ,1
  42.                             ,CHARINDEX(' ',TITLE.REST_OF_NAME)-1
  43.                            )
  44.         END AS FIRST_NAME
  45.        ,CASE WHEN 0 = CHARINDEX(' ',TITLE.REST_OF_NAME)  
  46.              THEN NULL  --no spaces @ all?  then 1st name is all we have
  47.              ELSE SUBSTRING(
  48.                              TITLE.REST_OF_NAME
  49.                             ,CHARINDEX(' ',TITLE.REST_OF_NAME)+1
  50.                             ,LEN(TITLE.REST_OF_NAME)
  51.                            )
  52.         END AS REST_OF_NAME
  53.        ,TITLE.ORIGINAL_INPUT_DATA
  54.       FROM
  55.         (  
  56.         SELECT
  57.           --if the first three characters are in this list,
  58.           --then pull it as a "title".  otherwise return NULL for title.
  59.           CASE
  60.                 WHEN (SUBSTRING(TEST_DATA.FULL_NAME,3,1) IN (' ','.') AND SUBSTRING(TEST_DATA.FULL_NAME,1,2) IN ('MR','MS','DR','FR'))
  61.                     THEN LTRIM(RTRIM(SUBSTRING(TEST_DATA.FULL_NAME,1,2)))
  62.                 WHEN (SUBSTRING(TEST_DATA.FULL_NAME,4,1) IN (' ','.') AND SUBSTRING(TEST_DATA.FULL_NAME,1,3) IN ('MRS','LRD','SIR'))
  63.                     THEN LTRIM(RTRIM(SUBSTRING(TEST_DATA.FULL_NAME,1,3)))
  64.                 WHEN (SUBSTRING(TEST_DATA.FULL_NAME,5,1) IN (' ','.') AND SUBSTRING(TEST_DATA.FULL_NAME,1,4) IN ('LORD','LADY','MISS','PROF'))
  65.                     THEN LTRIM(RTRIM(SUBSTRING(TEST_DATA.FULL_NAME,1,4)))
  66.                 ELSE
  67.                     NULL
  68.          END AS SALUTATION
  69.           --if you change the list, don't forget to change it here, too.
  70.           --so much for the DRY prinicple...
  71.          ,CASE
  72.                 WHEN (SUBSTRING(TEST_DATA.FULL_NAME,3,1) IN (' ','.') AND SUBSTRING(TEST_DATA.FULL_NAME,1,2) IN ('MR','MS','DR','FR'))
  73.                     THEN LTRIM(RTRIM(SUBSTRING(TEST_DATA.FULL_NAME,4,LEN(TEST_DATA.FULL_NAME))))
  74.                 WHEN (SUBSTRING(TEST_DATA.FULL_NAME,4,1) IN (' ','.') AND SUBSTRING(TEST_DATA.FULL_NAME,1,3) IN ('MRS','LRD','SIR'))
  75.                     THEN LTRIM(RTRIM(SUBSTRING(TEST_DATA.FULL_NAME,5,LEN(TEST_DATA.FULL_NAME))))
  76.                 WHEN (SUBSTRING(TEST_DATA.FULL_NAME,5,1) IN (' ','.') AND SUBSTRING(TEST_DATA.FULL_NAME,1,4) IN ('LORD','LADY','MISS','PROF'))
  77.                     THEN LTRIM(RTRIM(SUBSTRING(TEST_DATA.FULL_NAME,6,LEN(TEST_DATA.FULL_NAME))))
  78.                 ELSE
  79.                     LTRIM(RTRIM(TEST_DATA.FULL_NAME))
  80.           END AS REST_OF_NAME
  81.          ,TEST_DATA.ORIGINAL_INPUT_DATA
  82.         FROM
  83.           (
  84.      
  85.      
  86.           SELECT
  87.             --trim leading & trailing spaces before trying to process
  88.             --disallow extra spaces *within* the name
  89.             REPLACE(REPLACE(LTRIM(RTRIM(FULL_NAME)),'  ',' '),'  ',' ') AS FULL_NAME
  90.            ,FULL_NAME AS ORIGINAL_INPUT_DATA
  91.           FROM
  92.             (
  93.                 SELECT @name AS FULL_NAME
  94.             ) RAW_DATA
  95.           ) TEST_DATA
  96.  
  97.         ) TITLE
  98.       ) FIRST_NAME
  99.  
  100.       RETURN
  101. END
  102. GO
  103.  
  104. -- TESTING
  105. SELECT * FROM dbo.NameSplitter('Dr. Mark J Smith')
Add Comment
Please, Sign In to add comment