在 oracle 10g 中拆分一个可变长度的字符串

Split a variable length string in oracle 10g

我在拆分包含 oracle 名称的 space 定界可变长度字符串时遇到问题 10g.Below 是我的意思的几个例子

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

谢谢。

甲骨文 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 列中搜索 spaces 并按照您的描述提取值。它没有什么特别之处,除了 - 也许 - last_name 也有 case 表达。它检查第二个 space 是否存在;如果不是,则第一个 space 之后的子串是 last name;否则,第二个 space 之后的子串是 last name.

您可以在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