> 데이터 베이스 > MySQL 튜토리얼 > SQL의 전체 이름 필드에서 이름, 중간 이름, 성을 효율적으로 구문 분석하는 방법은 무엇입니까?

SQL의 전체 이름 필드에서 이름, 중간 이름, 성을 효율적으로 구문 분석하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-29 06:30:10
원래의
378명이 탐색했습니다.

How to Efficiently Parse First, Middle, and Last Names from a Full Name Field in SQL?

SQL의 전체 이름에서 이름, 중간, 성을 구문 분석

문제:

SQL의 단일 전체 이름 필드에서 이름, 중간 이름, 성을 어떻게 추출할 수 있나요? 이는 전체 이름과 정확히 일치하지 않는 이름을 일치시키는 데 유용합니다.

해결책:

90% 정확도를 제공하는 다음과 같은 실용적인 솔루션을 고려해 보겠습니다.

WITH FIRST_NAME AS (
  SELECT
    TITLE.ORIGINAL_INPUT_DATA,
    TITLE.TITLE,
    CASE
      WHEN 0 = CHARINDEX(' ', TITLE.REST_OF_NAME) THEN TITLE.REST_OF_NAME
      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 more spaces? assume rest is the last name
      ELSE SUBSTRING(TITLE.REST_OF_NAME, 1 + CHARINDEX(' ', TITLE.REST_OF_NAME), LEN(TITLE.REST_OF_NAME))
    END AS REST_OF_NAME
  FROM
    (
      SELECT
        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,
        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
            REPLACE(REPLACE(LTRIM(RTRIM(FULL_NAME)), ' ', ' '), ' ', ' ') AS FULL_NAME,
            FULL_NAME AS ORIGINAL_INPUT_DATA
          FROM
            (
              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
)
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
  FIRST_NAME;
로그인 후 복사

이 솔루션은 다음과 같은 특수 사례를 처리합니다.

  • NULL, 선행/후행 공백, 연속 공백
  • 중간 이름 없음
  • 별도의 열로 원래 전체 이름
  • 별도의 "제목" 열로 특정 접두사 목록

위 내용은 SQL의 전체 이름 필드에서 이름, 중간 이름, 성을 효율적으로 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿