【问题标题】:Split a variable length string in oracle 10g在 oracle 10g 中拆分可变长度字符串
【发布时间】:2022-01-13 17:35:45
【问题描述】:

我无法在 oracle 10g 中拆分包含名称的空格分隔的可变长度字符串。以下是我的意思的几个示例

1. Name : Alpha Beta 
   First_Name : Alpha
   Last_Name : Beta

2. Name : Alpha Beta Gamma
   First_Name : Alpha
   Middle_Name : Beta
   Last_Name : Gamma

3. Name : Alpha Beta Gamma Omega
   First_Name : Alpha
   Middle_Name : Beta
   Last_Name : Gamma Omega

谢谢。

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    Oracle 10g?那是一个老歌

    SQL> with test (id, name) as
      2    (select 0, 'Alpha'                  from dual union all
      3     select 1, 'Alpha Beta'             from dual union all
      4     select 2, 'Alpha Beta Gamma'       from dual union all
      5     select 3, 'Alpha Beta Gamma Omega' from dual
      6    )
      7  select id,
      8    substr(name, 1, case when instr(name, ' ') = 0 then length(name)
      9                         else instr(name, ' ') - 1
     10                    end
     11          ) first_name,
     12    --
     13    substr(name, instr(name, ' ') + 1,
     14                 instr(name, ' ', 1, 2) - instr(name, ' ') - 1
     15          ) middle_name,
     16    --
     17    case when instr(name, ' ') = 0 then null
     18         else substr(name, instr(name, ' ', 1, case when instr(name, ' ', 1, 2) = 0 then 1
     19                                                    else 2
     20                                               end) + 1)
     21    end last_name
     22  from test;
    
            ID FIRST_NAME      MIDDLE_NAME     LAST_NAME
    ---------- --------------- --------------- ---------------
             0 Alpha
             1 Alpha                           Beta
             2 Alpha           Beta            Gamma
             3 Alpha           Beta            Gamma Omega
    
    SQL>
    

    它有什么作用?在name 列中搜索空格并按照您的描述提取值。没什么特别的,除了 - 也许 - last_name 也有 case 表达式。检查第二个空格是否存在;如果不是,则第一个空格后的子字符串为 姓氏;否则,第二个空格后的子字符串是 last name

    【讨论】:

    • 非常感谢。成功了
    • 如果名称仅包含一个单词,如何仅将其映射到名字。现在它转到姓氏
    • 那是因为你没有说有这种可能性:) 我编辑了答案;请看一下。
    【解决方案2】:

    您可以使用Oracle DB 10g版本中的一些正则表达式函数,例如REGEXP_INSTR()REGEXP_SUBSTR()

    WITH t(id,name) AS
     (SELECT 1,'Alpha Beta'
        FROM dual
      UNION ALL
      SELECT 2,'Alpha Beta Gamma'
        FROM dual
      UNION ALL
      SELECT 3,'Alpha Beta Gamma Omega' FROM dual)
    SELECT id,
           REGEXP_SUBSTR(name, '([^ ]+)', 1, 1) AS First_Name,
           CASE
             WHEN LENGTH(name) - LENGTH(REPLACE(name,' ')) > 1 THEN
              REGEXP_SUBSTR(name, '([^ ]+)', 1, 2)
           END AS Middle_Name,
           CASE
             WHEN LENGTH(name) - LENGTH(REPLACE(name,' ')) = 1 THEN
              REGEXP_SUBSTR(name, '([^ ]+)', 1, 2)
             ELSE
              TRIM(REGEXP_SUBSTR(name, '(( .*)+)',REGEXP_INSTR(name, ' ',1,2),1))
           END AS Last_Name       
      FROM t
    

    结果集

    ID FIRST_NAME MIDDLE_NAME LAST_NAME
    1 Alpha Beta
    2 Alpha Beta Gamma
    3 Alpha Beta Gamma Omega

    【讨论】:

    • 感谢您的回复。
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多