【发布时间】:2018-06-07 17:21:34
【问题描述】:
我在一个字段中有全名(姓氏、名字中间名,包括后缀)。这是解析名称的业务规则
。姓氏:从第一个位置到逗号的字符将放在姓氏中。 .名字:逗号后面的第一个字符到下一个空格将转到名字。 .后缀:一旦派生了名字和姓氏,根据值(Jr、Sr、II、III、IV、V)在名称短语的剩余部分中搜索 Suffix name .中间名:将其余字符放入中间名。
- LST,FRST MDL SR(她的LST是姓氏,FRST是名字,MDL是中间名,SR后缀)
- LST,FRST SR MDL MDL2(她的 LST 是 LastName,FRST 是 FirstName,“MDL MDL2”是 middleName,SR 后缀)
- LST,FRST MDL1 JR MDL2 MDL3(她的LST是LastName,FRST是FirstName,“MDL1 MDL2 MDL3”是middleName,JR后缀)
含义 各种格式的后缀和中间名。是否可以编写查询以提取后缀并将其余部分放入中间名字段?
这是我的查询,但我正在寻找更简单的方法,而且我的查询是检查中间名中最多 3 个空格以查找后缀。
WITH IDN_NAM AS
(
SELECT RECORD_NUMBER, IDN.INDEX1,
trim(regexp_substr(REPLACE(IDN.IDN_NAM,',',' '), '[^ ]+',1,2)) AS FIRST_NAME,
trim(regexp_substr(REPLACE(IDN.IDN_NAM,',',' '), '[^ ]+',1,1)) AS LAST_NAME,
CASE WHEN instr(REPLACE(IDN.IDN_NAM,',',' '),' ',1,2)+1 = 1 THEN NULL ELSE substr(REPLACE(IDN.IDN_NAM,',',' '),instr(REPLACE(IDN.IDN_NAM,',',' '),' ',1,2)+1) END AS MID_NAME,
TRIM(IDN.IDN_NAM) AS FULL_NAME
FROM
(
SELECT IDN.RECORD_NUMBER, IDN_NAM IDN_NAM_ORIG, replace(replace(replace(REPLACE(IDN.IDN_NAM, ',', ' '),' ','<>'),'><',''),'<>',' ') IDN_NAM , IDN.INDEX1
FROM SNM_TMP_IDENTITY_IDN_NAM IDN,
TMP_LEGACY_EVENT T
WHERE IDN.RECORD_NUMBER = T.RECORD_NUMBER
AND NOT REGEXP_LIKE(IDN_NAM,'DLE.+[[:digit:]]')
) IDN
)
SELECT DECODE(INDEX1, 1, 'T', 'F') MASTER_IND, FIRST_NAME, LAST_NAME,--, MID_NAME, MID_NAM1, MID_NAM2, MID_NAM3, SUF1, SUF2, SUF3,
CASE WHEN SUF3 IS NULL AND SUF2 IS NULL AND SUF1 IS NULL THEN MID_NAME
WHEN SUF3 IS NOT NULL THEN NVL(MID_NAM1,'')||CASE WHEN MID_NAM2 IS NOT NULL THEN ' '||MID_NAM2 ELSE '' END
WHEN SUF2 IS NOT NULL THEN NVL(MID_NAM1,'')||CASE WHEN MID_NAM3 IS NOT NULL THEN ' '||MID_NAM3 ELSE '' END
WHEN SUF1 IS NOT NULL THEN NVL(MID_NAM2,'')||CASE WHEN MID_NAM3 IS NOT NULL THEN ' '||MID_NAM3 ELSE '' END
END MIDDLE_NAME,
NVL(SUF3, NVL(SUF2, SUF1)) NAME_SUFFIX_CD
FROM
(
SELECT NM.*,
(SELECT MAX(NAME_SUFFIX_CODE) FROM CRRMS_CODED.CODED_NAME_SUFFIX WHERE UPPER(REPLACE(NAME_SUFFIX_CODE,'.', '')) = UPPER(MID_NAM1)) SUF1,
(SELECT MAX(NAME_SUFFIX_CODE) FROM CRRMS_CODED.CODED_NAME_SUFFIX WHERE UPPER(REPLACE(NAME_SUFFIX_CODE,'.', '')) = UPPER(MID_NAM2)) SUF2,
(SELECT MAX(NAME_SUFFIX_CODE) FROM CRRMS_CODED.CODED_NAME_SUFFIX WHERE UPPER(REPLACE(NAME_SUFFIX_CODE,'.', '')) = UPPER(MID_NAM3)) SUF3
FROM
(
SELECT I.*,
trim(regexp_substr(MID_NAME, '[^ ]+',1,1)) AS MID_NAM1,
trim(regexp_substr(MID_NAME, '[^ ]+',1,2)) AS MID_NAM2,
trim(regexp_substr(MID_NAME, '[^ ]+',1,3)) AS MID_NAM3
FROM IDN_NAM I
) NM
)
;
【问题讨论】:
-
请提供一些数据示例、输入结构以及您希望如何查看最终结果。仅提供查询就很难将问题可视化。
-
对不起,我忘了说,我可以得到没有逗号的名字,比如“LST FRST MDL SR”。当我应用您的查询时,它没有返回任何内容。我希望第一个字符以空格(在这种情况下)作为姓氏,然后从空格到下一个空格作为名字,并为中间名和后缀保留相同的业务规则。感谢您的帮助。
-
姓:从第一个位置到逗号的字符(如果逗号不可用,则到第一个空格)将进入姓氏。名字:逗号后的第一个字符或第一个空格到下一个空格将转到名字。后缀:一旦派生了名字和姓氏,根据值 (Jr, Sr, II, III, IV, V) 在名称短语的剩余部分中搜索 Suffix name。中间名:将其余字符放入中间名。