如何在Oracle中提取字符串

如何在Oracle中提取字符串,oracle,regexp-substr,Oracle,Regexp Substr,我想在Oracle中提取以下字符串。我该怎么做 原始字符串:011113584378(+)卡,职员 预期字符串:员工卡 我想您有编写PL/SQL函数的特权吧?然后只需使用、和/或和|解析您的输入 以下是一个例子: …该字段可能包含以下值: F:\Siebfile\YD\S\u SR\u ATT\u 1-60SS\u 1-AM3L.SAF 在这种情况下,我需要返回'1-60SS'的值,因为这是位于第3和第4个下划线之间的值 解决方案: create or replace function pa

我想在Oracle中提取以下字符串。我该怎么做

  • 原始字符串:
    011113584378(+)卡,职员
  • 预期字符串:
    员工卡

    • 我想您有编写PL/SQL函数的特权吧?然后只需使用、和/或和
      |
      解析您的输入

      以下是一个例子:

      …该字段可能包含以下值:

      F:\Siebfile\YD\S\u SR\u ATT\u 1-60SS\u 1-AM3L.SAF

      在这种情况下,我需要返回'1-60SS'的值,因为这是位于第3和第4个下划线之间的值

      解决方案:

      create or replace function parse_value (pValue varchar2)
         return varchar2
      is
         v_pos3 number;
         v_pos4 number;
      
      begin
      
         /* Return 3rd occurrence of '_' */
         v_pos3 := INSTR (pValue, '_', 1, 3) + 1;
      
         /* Return 4rd occurrence of '_' */
         v_pos4 := INSTR (pValue, '_', 1, 4);
      
         return SUBSTR (pValue, v_pos3, v_pos4 - v_pos3);
      
      end parse_value;
      

      我想您有编写PL/SQL函数的特权吧?然后只需使用、和/或和
      |
      解析您的输入

      以下是一个例子:

      …该字段可能包含以下值:

      F:\Siebfile\YD\S\u SR\u ATT\u 1-60SS\u 1-AM3L.SAF

      在这种情况下,我需要返回'1-60SS'的值,因为这是位于第3和第4个下划线之间的值

      解决方案:

      create or replace function parse_value (pValue varchar2)
         return varchar2
      is
         v_pos3 number;
         v_pos4 number;
      
      begin
      
         /* Return 3rd occurrence of '_' */
         v_pos3 := INSTR (pValue, '_', 1, 3) + 1;
      
         /* Return 4rd occurrence of '_' */
         v_pos4 := INSTR (pValue, '_', 1, 4);
      
         return SUBSTR (pValue, v_pos3, v_pos4 - v_pos3);
      
      end parse_value;
      

      好的,我咬一口。本例使用REGEXP_REPLACE来描述字符串,保存所需的部分,以便在返回它们之前重新排列它们。如果您展示一些您正在处理的数据的真实示例,会更好,因为我只能保证这个示例将使用您提供的一行代码

      正则表达式匹配从字符串开头开始并以空格结尾的任何字符。下一组任何字符(最多不包括逗号空格)将通过将其包含在括号中来“记住”。这就是所谓的俘获群。下一个捕获的组是逗号空格分隔符之后直到行尾(美元符号)的字符集。捕获的组按从左到右的顺序引用。第三个参数是要返回的字符串,它是按顺序捕获的第二个和第一个组,由空格分隔

      SQL> with tbl(str) as (
           select '+011113584378(+) CARD, STAFF' from dual
         )
         select regexp_replace(str, '^.*\) (.*), (.*)$', '\2 \1') formatted
         from tbl;
      
      FORMATTED
      ----------
      STAFF CARD
      
      SQL>
      

      好的,我咬一口。本例使用REGEXP_REPLACE来描述字符串,保存所需的部分,以便在返回它们之前重新排列它们。如果您展示一些您正在处理的数据的真实示例,会更好,因为我只能保证这个示例将使用您提供的一行代码

      正则表达式匹配从字符串开头开始并以空格结尾的任何字符。下一组任何字符(最多不包括逗号空格)将通过将其包含在括号中来“记住”。这就是所谓的俘获群。下一个捕获的组是逗号空格分隔符之后直到行尾(美元符号)的字符集。捕获的组按从左到右的顺序引用。第三个参数是要返回的字符串,它是按顺序捕获的第二个和第一个组,由空格分隔

      SQL> with tbl(str) as (
           select '+011113584378(+) CARD, STAFF' from dual
         )
         select regexp_replace(str, '^.*\) (.*), (.*)$', '\2 \1') formatted
         from tbl;
      
      FORMATTED
      ----------
      STAFF CARD
      
      SQL>
      

      为什么有人需要编写PL/SQL函数来使用SUBSTR和INSTR?为什么有人需要编写PL/SQL函数来使用SUBSTR和INSTR?从输入到输出的逻辑是什么?格式是否始终为空格逗号空格?字母序列是否总是非空的?它们只是字母,还是也可以包含破折号(-)或下划线(_)或数字?在我们考虑任何类型的代码之前,请澄清逻辑。从输入到输出的逻辑是什么?格式是否始终为空格逗号空格?字母序列是否总是非空的?它们只是字母,还是也可以包含破折号(-)或下划线(_)或数字?在我们考虑任何类型的代码之前,请澄清逻辑。