Oracle 基于空间将字符串拆分为3部分

Oracle 基于空间将字符串拆分为3部分,oracle,Oracle,我需要将数据分成3部分 以下是数据: 输入: 输出: 我已经编写了下面的代码,它工作得非常好。我在表中有大约50 mil+的数据,执行起来需要很多时间 update input_table set FNAME = regexp_substr(Fullname, '[^ ]+', 1, 1) , Sname = regexp_substr(Fullname, '[^ ]+', 1,2) , L

我需要将数据分成3部分

以下是数据:

输入:

输出:

我已经编写了下面的代码,它工作得非常好。我在表中有大约50 mil+的数据,执行起来需要很多时间

update  input_table
       set  FNAME = regexp_substr(Fullname, '[^ ]+', 1, 1) ,            
            Sname =  regexp_substr(Fullname, '[^ ]+', 1,2) ,       
            Lname =  case   When instr(Fullname,' ',1,3)<>0  then  substr(Fullname,instr(Fullname,' ',1,2)+1)
                 else '' end; 
commit;

有没有更好的方法来处理这个问题?

在Oracle 12之前,regexp函数非常慢。即使在Oracle12+上,它们也比substr/instr函数慢,因此使用substr/instr会快得多。 唯一的问题是您需要删除字符串中的多余空格字符,但是使用replace函数有一个非常快速的解决方案:replacefullname、、'*','*'

例如:

将输入_tableFullname设置为 从tableku$\vcnt中选择* "Test1",, “Test1 Test2”, “Test1 Test2 Test3”, “Test1 Test2 Test3”, “Test1 Test2 Test3 Test4 Test5”, “Test1 Test2 Test3 Test4 Test5” 选择 全名, TrimReplaceFullName、“*”、“*”、“*”、“*”全名_2 从输入_表; 结果:

FULLNAME                            FULLNAME_2
----------------------------------- -----------------------------------
Test1                               Test1
Test1 Test2                         Test1 Test2
Test1 Test2 Test3                   Test1 Test2 Test3
Test1   Test2   Test3               Test1 Test2 Test3
Test1 Test2 Test3 Test4 Test5       Test1 Test2 Test3 Test4 Test5
Test1   Test2   Test3 Test4 Test5   Test1 Test2 Test3 Test4 Test5

6 rows selected.
因此,现在我们可以轻松地按“”拆分全名:

将输入_tableFullname设置为 从tableku$\vcnt中选择* "Test1",, “Test1 Test2”, “Test1 Test2 Test3”, “Test1 Test2 Test3”, “Test1 Test2 Test3 Test4 Test5”, “Test1 Test2 Test3 Test4 Test5” 选择 v、 *, substrFullname,1,instrFullname | |,'',FNAME|u substr, substrFullname,instrFullname,“+1,instrFullname | |,”,1,2-instrFullname,“-SNAME|u substr, substrFullname | |“”,instrFullname | |“”,1,2+1 LNAME|u substr 从…起 选择 全名为Fullname_old, TrimReplaceFullName、“*”、“*”、“*”、“*”作为Fullname 从输入_表 v 结果:

FULLNAME_OLD                        FULLNAME                            FNAME_SUBS SNAME_SUBS LNAME_SUBSTR
----------------------------------- ----------------------------------- ---------- ---------- --------------------
Test1                               Test1                               Test1
Test1 Test2                         Test1 Test2                         Test1      Test2
Test1 Test2 Test3                   Test1 Test2 Test3                   Test1      Test2      Test3
Test1   Test2   Test3               Test1 Test2 Test3                   Test1      Test2      Test3
Test1 Test2 Test3 Test4 Test5       Test1 Test2 Test3 Test4 Test5       Test1      Test2      Test3 Test4 Test5
Test1   Test2   Test3 Test4 Test5   Test1 Test2 Test3 Test4 Test5       Test1      Test2      Test3 Test4 Test5

6 rows selected.
使用chr0代替*,示例如下:

将输入_tableFullname设置为 从tableku$\vcnt中选择* "Test1",, “Test1 Test2”, “Test1 Test2 Test3”, “Test1 Test2 Test3”, “Test1 Test2 Test3 Test4 Test5”, “Test1 Test2 Test3 Test4 Test5”, “Test1 Test2 Test3 Test4 Test5”, “Test1 Test2 Test3 Test4 Test5” 选择 v、 *, substrFullname,1,instrFullname | |,'',FNAME|u substr, substrFullname,instrFullname,“+1,instrFullname | |,”,1,2-instrFullname,“-SNAME|u substr, substrFullname | |“”,instrFullname | |“”,1,2+1 LNAME|u substr 从…起 选择 全名为Fullname_old, TrimReplaceFullName,'',''| | chr0,chr0 | |''',chr0作为全名 从输入_表 v
@user2815115您不能在注释中发布代码-注释部分会破坏它们。请在问题中或在pastebin或gist.github上发布一个示例。com@user2815115啊,谢谢,我已经找到问题并解决了。请参阅更新的answer@user2815115您可以改用chr0。严格地说,我使用*只是为了更易于阅读。chr0将是better@user2815115看看这个:我使用regex_substr244秒和Substring/Instring93秒测试了性能。是的,你的方法要快得多。再次感谢
FULLNAME_OLD                        FULLNAME                            FNAME_SUBS SNAME_SUBS LNAME_SUBSTR
----------------------------------- ----------------------------------- ---------- ---------- --------------------
Test1                               Test1                               Test1
Test1 Test2                         Test1 Test2                         Test1      Test2
Test1 Test2 Test3                   Test1 Test2 Test3                   Test1      Test2      Test3
Test1   Test2   Test3               Test1 Test2 Test3                   Test1      Test2      Test3
Test1 Test2 Test3 Test4 Test5       Test1 Test2 Test3 Test4 Test5       Test1      Test2      Test3 Test4 Test5
Test1   Test2   Test3 Test4 Test5   Test1 Test2 Test3 Test4 Test5       Test1      Test2      Test3 Test4 Test5

6 rows selected.