根据竖线分隔符拆分varchar2变量

Split varchar2 variable based on vertical line delimiter

我有以下 plsql 代码

DECLARE
   v_personal_info VARCHAR2(100);
   v_name VARCHAR2(100);
   v_signature VARCHAR2(100);
   CURSOR c_personal_info
   IS
     select personal_info from users where name is not null;
BEGIN
  FOR lr_row IN c_personal_info
  LOOP
    v_personal_info := lr_row.personal_info;
    -- Need to split v_personal_info based on |
  END LOOP;
END;
/

v_personal_info 的典型值看起来像 'Aniket Thakur | athakur',我需要将其拆分为不同的变量,例如

v_name := 'Aniket Thakur'
v_signature := 'athakur'

我应该怎么做。是否有任何内置函数可以根据预定义的分隔符进行拆分?

如果v_personal_info的值是统一的并且总是string_1+|+string_2的结构,那么你可以很容易地使用REGEXP_SUBSTR

那样的话,你的程序可以这样写:

DECLARE
   v_personal_info VARCHAR2(100);
   v_name VARCHAR2(100);
   v_signature VARCHAR2(100);
   CURSOR c_personal_info
   IS
     select personal_info from users where name is not null;
BEGIN
  FOR lr_row IN c_personal_info
  LOOP
    v_personal_info := lr_row.personal_info;
    v_name := REGEXP_SUBSTR ( v_personal_info, '^[^|]*');
    v_signature := REGEXP_SUBSTR (v_personal_info,'[^|]*$')
  END LOOP;
END;
/

当然,除非您将这些值写在某处,否则实际上该过程没有用。

但是,如果您想要一种使用不同定界符拆分字符串的通用方法,则必须创建自己的函数。这里有多个例子可以做到这一点。参见 this & this

其中一位 SO 用户写了一篇非常好的文章 Split single comma delimited string into rows in Oracle

Hawks 的回答很好,但我不想使用正则表达式,所以我使用简单的 SUBSTRINSTR 方法。

DECLARE
   v_personal_info VARCHAR2(100);
   v_name VARCHAR2(100);
   v_signature VARCHAR2(100);
   delimitIndex number;
   CURSOR c_personal_info
   IS
     select personal_info from users where name is not null;
BEGIN
  FOR lr_row IN c_personal_info
  LOOP
    v_personal_info := lr_row.personal_info;
    delimitIndex := INSTR(v_personal_info, '|');
    if delimitIndex != 0 then
        v_name := SUBSTR(v_personal_info, 1, delimitIndex - 1);
        v_signature := SUBSTR(v_personal_info, delimitIndex+1, LENGTH(v_personal_info)-delimitIndex);
    END if;
  END LOOP;
END;
/