【发布时间】:2021-06-03 20:45:47
【问题描述】:
请帮忙解决这个问题
输入
| Fullname |
|---|
| SZAFLARSKI,ANDRZEJ S |
| SZAFLARSKI,ANDRZEJ Santa |
| SZAFLARSKI rel,ANDRZEJ |
输出
| Firstname | Middlename | Lastname | |
|---|---|---|---|
| ANDRZEJ | S | SZAFLARSKI | This format for length = 1 |
| ANDRZEJ Santa | null | SZAFLARSKI | This format for length greater than 1
|
| ANDRZEJ | null | SZAFLARSKI rel | It has to search for firstname after comma(,) |
如果中间名长度大于 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 个场景失败了。
【问题讨论】:
-
您自己尝试过什么吗?您至少应该能够弄清楚如何获得姓氏。你知道如何在字符串中找到逗号吗?你知道如何获取字符串的子字符串吗?以下是字符串函数列表:docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/…。然后,对于“如果最后一部分是单个字符”,SQL 中有
CASE WHEN。向我们展示您拥有什么以及您遇到的问题。 -
选择lastN,当length(midN) = 1然后midN结束为midN,firstN ||长度(midN)> 1 然后 ' ' || 的情况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 种情况失败了
-
您可以edit您的问题。您评论中的 SQL 应该在您的问题中。