当前位置: 首页 > 知识库问答 >
问题:

将名称拆分为Fname、Mname和Lname

龙俊良
2023-03-14

请帮忙这个表情

如果中间名长度大于1,则firstname附加中间名,中间名为null。如果中间名长度=1,则仅使用中间名和名字拆分到空格之前。Firstname的搜索应该从逗号(,)开始,第三个场景应该匹配。

有人能解释一下吗?

select lastN,
       case when length(midN) = 1 then midN end as midN,
       firstN || case when length(midN) > 1 then ' ' || midN end as firstN
  from ( select regexp_substr('BOULAY d,STEPHEN', '([^,]+),', 1, 1, '', 1) as lastN,
                regexp_substr('BOULAY d,STEPHEN', ',([^ ]+)', 1, 1, '', 1) as firstN,
                regexp_substr('BOULAY d,STEPHEN', ' (.+)', 1, 1, '', 1) as midN
           from dual );

在此查询中,我已经实现了前2个场景,但对于第3个场景,它失败了。

共有2个答案

刘承悦
2023-03-14

使用REGEXP\u SUBSTR可以使用^作为字符串的开始,使用$作为字符串的结束。

使用像“%”这样的全名来确定结尾的空白后面是否只有一个字符。(如果您更喜欢的话,当然也可以像使用REGEXP_一样。)

select
  case when fullname like '% _'
    then regexp_substr(fullname, '([^,]+) .$', 1, 1, 'i', 1)
    else regexp_substr(fullname, '[^,]+$')
  end as first_name,
  case when fullname like '% _'
    then regexp_substr(fullname, '.$')
    else ''
  end as middle_name,
  regexp_substr(fullname, '^[^,]+') as last_name
from mytable;

演示:https://dbfiddle.uk/?rdbms=oracle_18

郏稳
2023-03-14

你也可以试试这个:

^  -->  Finds regex that must match at the beginning of the line
$  --> Finds regex that must match at the end of the line.
\w --> A word character, short for [a-zA-Z_0-9]
\s --> A whitespace character, short for [ \t\n\x0b\r\f]

函数长度(regexp\u substr(全名,“,\w\s*(\w*)$”,1,1,“,,1))返回中间名路径的长度(如果存在)。

with your_table (Fullname) as (
select 'SZAFLARSKI,ANDRZEJ S'      from dual union all
select 'SZAFLARSKI,ANDRZEJ Santa'  from dual union all
select 'SZAFLARSKI rel,ANDRZEJ'    from dual
)
select Fullname
, case when length(regexp_substr(Fullname, ',\w+\s*(\w*)$', 1, 1, '', 1)) > 1 
        then regexp_substr(Fullname, ',([^,]+)$', 1, 1, '', 1) 
      else regexp_substr(Fullname, ',(\w+)\s*\w*$', 1, 1, '', 1)
  end FirstName
, case when length(regexp_substr(Fullname, ',\w+\s*(\w*)$', 1, 1, '', 1)) > 1 
        then null
      else regexp_substr(Fullname, ',\w+\s*(\w*)$', 1, 1, '', 1)
    end middleName
, regexp_substr(Fullname, '^[^,]+', 1, 1)Lastname 
from your_table
;

DB

 类似资料:
  • 我对将全名分为名字和姓氏的功能感到困惑。例如,我有这些记录 我期待这样的结果 你能帮我吗?谢谢

  • 问题内容: 我有一个客户列表,其名称为全名。我想创建一个将全名作为参数并分别返回名字和姓氏的函数。如果不可能,我可以有两个单独的函数,一个返回名字,另一个返回姓氏。全名列表包含最多三个单词的名称。我想要的是: 全名由两个词组成时。第一个应该是名称,第二个应该是姓氏。 当一个全名由三个词组成时。第一个单词和中间单词应为名字,第三个单词应为姓氏。 例子:- 结果:- 我搜索并找到了无法按预期运行的解决

  • 我怎么能把字典分成两个列表,一个键,一个值。例如采取: 并将其分为: 有什么想法吗,伙计们?

  • 问题内容: 假设我有一个如下所示的Javascript数组: 什么方法适合将数组分块(拆分)为更小的数组,最多可以有10个元素? 问题答案: 该array.slice方法可以从一开始,中间,或自己需要的任何目的数组的结束提取切片,在不改变原来的数组。

  • 问题内容: 我有桌子: 我想要这样的输出: 问题答案: 如果可以创建一个数字表,其中包含从1到要拆分的最大字段的数字,则可以使用以下解决方案: 请看这里的小提琴。 如果无法创建表,则解决方案可以是: 这里有个小提琴例子。

  • 问题内容: 我有一个具有这种结构的表。 我无法弄清楚我将使用哪种SQL查询来获得这样的结果集: 我正在尝试将三列分为三个单独的行。这可能吗? 问题答案: SELECT Y.UserID, Y.UserName, QuestionName = ‘AnswerToQuestion’ + X.Which, Response = CASE X.Which WHEN ‘1’ THEN AnswerToQue