есть ли способ переставить две строки и получить в результате таблицу?

У меня есть следующие две строки:

      String_Cod   = 14521;65412;65845
String_Flags = 1;0;1


for code 14521 the flag is 1
for code 65412 the flag is 0
for code 65845 the flag is 1
in this order always

Результат должен быть примерно таким

Я начинаю с этого запроса:

      select regexp_substr(to_char(:STRING_COD),'[^;]+', 1, level)
from dual
connect BY regexp_substr(to_char(:STRING_COD), '[^;]+', 1, level)
is not null

select regexp_substr(to_char(:STRING_FLAGS),'[^;]+', 1, level)
from dual
connect BY regexp_substr(to_char(:STRING_FLAGS), '[^;]+', 1, level)
is not null

Но я понятия не имею, как продолжить объединение обоих и получить нужный мне результат.

Может кто-нибудь посоветует?

С Уважением

1 ответ

Решение

Вы можете добавить уровень в качестве другого столбца в каждый запрос и объединить их вместе:

      select c.cod, f.flag
from (
  select level as n, regexp_substr(to_char('14521;65412;65845'),'[^;]+', 1, level) as cod
  from dual
  connect BY regexp_substr(to_char('14521;65412;65845'), '[^;]+', 1, level)
  is not null
) c
join (
  select level as n, regexp_substr(to_char('1;0;1'),'[^;]+', 1, level) as flag
  from dual
  connect BY regexp_substr(to_char('1;0;1'), '[^;]+', 1, level)
  is not null
) f
on f.n = c.n

которые - с внешними соединениями - допускают разное количество элементов; или, проще говоря, как вы предполагаете, они всегда будут совпадать, используйте один и тот же уровень для обоих отрывков:

      select regexp_substr(to_char('14521;65412;65845'),'[^;]+', 1, level) as cod,
  regexp_substr(to_char('1;0;1'),'[^;]+', 1, level) as flag
from dual
connect BY regexp_substr(to_char('14521;65412;65845'), '[^;]+', 1, level)
is not null
      COD   | FLAG
:---- | :---
14521 | 1   
65412 | 0   
65845 | 1   

db<> скрипка

Этот метод расширения списка значений также предполагает, что у вас никогда не может быть нулевых элементов ни в одном списке. Читать далее.

Другие вопросы по тегам