【问题标题】:Formatting a string in Oracle SQL在 Oracle SQL 中格式化字符串
【发布时间】:2020-11-03 01:15:37
【问题描述】:

我正在尝试获取作为过程输入的 varchar2 并对其进行格式化,然后使用新字符串进行一些计算。输入将是一系列以逗号分隔的名称:

示例:姓名、身份证、地址

我需要找到一种方法将以上内容更改为:

CAST(name AS VARCHAR2(200)) name, 
CAST(id AS VARCHAR2(200)) id, 
CAST(address AS VARCHAR2(200)) address

我尝试查看REGEXP_REPLACE,但我是初学者,所以我不知道如何正确使用正则表达式。

(顺便说一下,这是针对 Oracle SQL 的)

【问题讨论】:

  • 对为什么您的存储过程不只接受名称、ID 和地址的参数感到困惑
  • 我应该有一个列名列表作为输入,其中可以有 1 个或多个逗号分隔的名称。所以我不知道我在执行时得到了多少个名字。抱歉,如果问题中没有明确说明。
  • 您将在过程中使用 PLSQL 遍历输入字符串。寻找分隔符 - 在你的情况下逗号',',然后将其间的位转换为变量。
  • @DariaDavaloo '如何以不同的方式格式化该字符串。'您能否向我们展示一些您想要得到的结果的示例?只有几对:输入 - 要求的结果

标签: sql oracle replace format


【解决方案1】:

看起来这应该适合你:

create or replace procedure p_test(params in varchar2) as 
   -- type for string array (collection/nested table)
   type t_str_array is table of varchar2(100);
   -- string array
   str_array t_str_array:=t_str_array();
   -- variable for a count of elements in comma-separated list
   cnt int;
   
   name    varchar2(100);
   id      varchar2(100);
   address varchar2(100);
begin
   -- count of elements in comma-separated list:
   cnt := regexp_count(params,'[^,]+');
   -- extending string collection up to CNT elements:
   str_array.extend(cnt);
   -- iterate and fill array:
   for i in 1..cnt loop
      str_array(i):=regexp_substr(params,'[^,]+',1,i);
   end loop;
   
   -- now we can set required variables to the values from array by their positions:
   name   :=str_array(1);
   id     :=str_array(2);
   address:=str_array(3);
   
   -- print them to check anddebug:
   dbms_output.put_line(utl_lms.format_message('name = %s, id = %s, addr = %s', name, id, address));
end;
/

和测试:

SQL> call p_test('Pups,1,Interstate 60');
name = Pups, id = 1, addr = Interstate 60

Call completed.

【讨论】:

    【解决方案2】:

    我只是在编写由 substr 和 instr 组成的表达式的 select 语句。您也可以在过程中使用相同的表达式来获得所需的输出。 我假设 example_string 包含名称、id、地址的逗号分隔值。

    SELECT SUBSTR(example_string,1,INSTR(example_String,',',1,1)-1) AS name, SUBSTR(example_string,INSTR(example_String,',',1,1)+1,INSTR(example_String,',',1,2)-INSTR(example_String,',',1,1)-1) AS id, SUBSTR(example_string,INSTR(example_String,',',1,2)+1) AS address FROM dual;
    

    【讨论】:

      【解决方案3】:

      你真的不需要正则表达式; instr + substr 做得很好,因为这是一个非常简单的任务。

      SQL> create or replace procedure p_test (par_string in varchar2) is
        2    -- comma positions
        3    l_pos1    number := instr(par_string, ',', 1, 1);
        4    l_pos2    number := instr(par_string, ',', 1, 2);
        5    l_pos3    number := instr(par_string, ',', 1, 3);
        6    -- variables
        7    l_name    varchar2(200);
        8    l_id      varchar2(200);
        9    l_address varchar2(200);
       10  begin
       11    l_name    := substr(par_string, 1, l_pos1 - 1);
       12    l_id      := substr(par_string, l_pos1 + 1, l_pos2 - l_pos1 - 1);
       13    l_address := substr(par_string, l_pos2 + 1);
       14
       15    dbms_output.put_line('Name    = ' || l_name);
       16    dbms_output.put_line('ID      = ' || l_id);
       17    dbms_output.put_line('Address = ' || l_address);
       18  end;
       19  /
      
      Procedure created.
      

      测试:

      SQL> set serveroutput on
      SQL> exec p_test('Little Foot,25,Manhattan 23 New York');
      Name    = Little Foot
      ID      = 25
      Address = Manhattan 23 New York
      
      PL/SQL procedure successfully completed.
      
      SQL>
      

      【讨论】:

      • 感谢小脚的快速回答。我一直在寻找的是如何以不同的方式格式化该字符串。在执行的时候,我不知道这个字符串有多长。我的示例有 3 个名称,但可能会有所不同
      • 不客气。 INSTR 搜索逗号位置,所以 - 是的,它可能会有所不同。你试过了吗?你遇到了什么问题?这可以改进,但是 - 从您发布的示例来看,应该没问题。
      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多