Есть ли что-то наподобие функции * zip Python для коллекций в Oracle SQL? - PullRequest
2 голосов
/ 13 февраля 2020

При рефакторинге некоторых сложных пакетов PL / SQL для повышения производительности несколько раз у меня возникала следующая ситуация:

Ввод: два PL / SQL VARRAYs A и B или TABLE одинаковой длины (для Например, SYS.ODCIVarchar2List), например,

A := SYS.ODCIVarchar2List('Summer', 'Winter');
B := SYS.ODCIVarchar2List('hot', 'cold');

(записи в списках по заданному индексу соответствуют друг другу).

Теперь у меня более или менее сложный SQL оператор (например, MERGE INTO), где мне нужен гипотетический «zip (A, B)» в качестве ввода.

Единственное решение, которое я нашел до сих пор, - это конструкция, подобная этой:

with t1 as (select rownum rn, column_value as season from table(:A))
   , t2 as (select rownum rn, column_value as temperature from table(:B))
   , input as (select t1.season, t2.temperature
               from t1, t2
               where t1.rn = t2.rn
              )
-- Now do something with the input. For demonstration purpose, just show it:
select * from input;

Это работает, но кажется слишком сложным для такой простой задачи.

Есть ли лучшее решение?

Примечание: я знаю о теоретической неопределенности относительно порядок «выбрать из таблицы (...)». Это всегда работало, поэтому давайте не будем обсуждать это здесь, пока однажды кто-то не сможет показать пример, где это не так.

В качестве примечания (и для дальнейшего уточнения вопроса): В Python я может сделать это:

L=[1,2]
M=["A","B"]
list(zip(L,M))

, и это возвращает список такой же длины, как L и M с объединенными записями:

[(1, 'A'), (2, 'B')]

Что мне нужно, это что-то вроде этого в SQL.

...