【问题标题】:Split varchar2 variable based on vertical line delimiter根据垂直行分隔符拆分 varchar2 变量
【发布时间】:2015-12-05 09:41:09
【问题描述】:

我有以下 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'

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

【问题讨论】:

    标签: variables plsql oracle11g split oracle-sqldeveloper


    【解决方案1】:

    如果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 写了一篇非常好的文章

    【讨论】:

      【解决方案2】:

      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;
      /
      

      【讨论】:

        猜你喜欢
        • 2018-12-27
        • 2020-03-20
        • 2022-01-20
        • 2019-09-19
        • 2013-02-27
        • 2018-10-25
        • 1970-01-01
        • 2019-05-17
        • 2019-09-23
        相关资源
        最近更新 更多