2015-09-04 3 views
3

После выполнения ниже выберите, как назначить его в переменные.Разделите строку на переменные

Если строка ввода «x/y/z», я должен хранить «x» в переменной say A, «y» в переменную B и z в переменную «C».

Предположим, что если строка «x/z», тогда мне нужно сохранить «x» в переменную say A, но z в переменную «c».

во всех остальных случаях предположим, если входная строка только «х» или «х/у/г/г», то ничто не может быть сохранен

SELECT REGEXP_SUBSTR(<<Input String>>, '[^/]+', 1, LEVEL) 
           FROM DUAL 
        CONNECT BY REGEXP_SUBSTR((<<Input String>>, '[^/]+', 1, LEVEL) 

IS NOT NULL; 
+0

вопрос довольно неясно. Для доступа к элементам запроса вы должны прочитать курсор, это можно сделать несколькими способами. Например, вы можете перебирать элементы в цикле FOR FOR и оценивать значения переменных. –

ответ

1

Вместо того, чтобы использовать SQL, я бы просто использовать PL/SQL, так как кажется, нет необходимости вводить ненужное переключение контекста:

declare 
    v_a varchar2(10); 
    v_b varchar2(10); 
    v_c varchar2(10); 
    v_string varchar2(33); 
    procedure split_string (p_string in varchar2, 
          p_a out varchar2, 
          p_b out varchar2, 
          p_c out varchar2) 
    is 
    begin 
    if regexp_count(p_string, '/') = 2 then 
     p_a := regexp_substr(p_string, '[^/]+', 1, 1); 
     p_b := regexp_substr(p_string, '[^/]+', 1, 2); 
     p_c := regexp_substr(p_string, '[^/]+', 1, 3); 
    elsif regexp_count(p_string, '/') = 1 then 
     p_a := regexp_substr(p_string, '[^/]+', 1, 1); 
     p_c := regexp_substr(p_string, '[^/]+', 1, 2); 
    end if; 
    end; 
begin 
    v_string := 'x/y/z'; 
    split_string(v_string, v_a, v_b, v_c); 
    dbms_output.put_line('v_string = "'||v_string||'", v_a = "'||v_a||'", v_b = "'||v_b||'", v_c = "'||v_c||'"'); 

    v_string := 'x/y'; 
    split_string(v_string, v_a, v_b, v_c); 
    dbms_output.put_line('v_string = "'||v_string||'", v_a = "'||v_a||'", v_b = "'||v_b||'", v_c = "'||v_c||'"'); 

    v_string := 'x/y/z/1'; 
    split_string(v_string, v_a, v_b, v_c); 
    dbms_output.put_line('v_string = "'||v_string||'", v_a = "'||v_a||'", v_b = "'||v_b||'", v_c = "'||v_c||'"'); 

    v_string := 'x'; 
    split_string(v_string, v_a, v_b, v_c); 
    dbms_output.put_line('v_string = "'||v_string||'", v_a = "'||v_a||'", v_b = "'||v_b||'", v_c = "'||v_c||'"'); 
end; 
/

v_string = "x/y/z", v_a = "x", v_b = "y", v_c = "z" 
v_string = "x/y", v_a = "x", v_b = "", v_c = "y" 
v_string = "x/y/z/1", v_a = "", v_b = "", v_c = "" 
v_string = "x", v_a = "", v_b = "", v_c = "" 

Если вы абсолютно необходимо использовать SQL, нет необходимости использовать подключения с помощью - вы можете просто разделить результаты в 3 колонки, чтобы соответствовать 3 переменные вы хотите ввести результаты в:

with strings as (select 'x/y/z' str from dual union all 
       select 'x/y' str from dual union all 
       select 'x/y/z/1' str from dual union all 
       select 'x' str from dual) 
select str, 
     case when regexp_count(str, '/') in (1, 2) then regexp_substr(str, '[^/]+', 1, 1) end v_a, 
     case when regexp_count(str, '/') = 2 then regexp_substr(str, '[^/]+', 1, 2) end v_b, 
     case when regexp_count(str, '/') = 2 then regexp_substr(str, '[^/]+', 1, 3) 
      when regexp_count(str, '/') = 1 then regexp_substr(str, '[^/]+', 1, 2) 
     end v_c 
from strings; 

STR  V_A     V_B     V_C     
------- --------------------- --------------------- --------------------- 
x/y/z x      y      z      
x/y  x           y      
x/y/z/1                 
x  
1

Будьте внимательны, regex_substr, используя формат '[^/]+' для анализа элементов строки do not handle null list elements. Вот способ извлечь определенный элемент из списка, который обрабатывает аннулирует, которые могут быть put into a function for reuse (это получает первый элемент, где разделитель слэш):

REGEXP_SUBSTR(string_in, '(.*?)(/|$)', 1, 1, NULL, 1); 

См ссылку выше, но называть так просто пример, где элементы списка извлекаются по порядку функцией, называемой get_list_element, и назначаются переменным. Может быть, вы можете применить эту логику к вашим потребностям:

SQL> declare 
    2 a varchar2(1); 
    3 b varchar2(1); 
    4 c varchar2(1); 
    5 begin 
    6 select get_list_element('x/y/z', 1, '/'), 
    7   get_list_element('x/y/z', 2, '/'), 
    8   get_list_element('x/y/z', 3, '/') 
    9 into a, b, c 
10 from dual; 
11 
12 dbms_output.put_line('a: ' || a); 
13 dbms_output.put_line('b: ' || b); 
14 dbms_output.put_line('c: ' || c); 
15 end; 
16/
a: x 
b: y 
c: z 

PL/SQL procedure successfully completed. 

SQL> 

Или исправить оригинальный попробовать на поворачивание ваших элементов в строках с этим:

SQL> with tbl(str) as (
    2 select 'x/y/z' from dual 
    3 ) 
    4 select regexp_substr(str, '(.*?)(/|$)', 1, level, null, 1) element 
    5 from tbl 
    6 connect by level <= regexp_count(str, '/')+1; 

ELEME 
----- 
x 
y 
z 

SQL> 
Смежные вопросы