#sql #oracle
Вопрос:
Как сохранить список в переменной и использовать его позже в разных частях SQL?
У меня есть такой sql, как показано на рисунке, содержимое списка дублируется. Я пытался использовать DECLARE
или DEFINE
, но, похоже, это не для этого случая
SELECT
l.cod
FROM list l
WHERE l.cod IN ( '1999', '1998', '1997' ...) --- same list
UNION
SELECT
l.cod
FROM list l JOIN blablabla....
WHERE l.cod IN ( '1999', '1998', '1997' ...) --- same list
Как я могу решить эту проблему лучшим способом?
Комментарии:
1. Вы рассматривали возможность хранения во временной таблице?
Ответ №1:
Один из вариантов-использовать этот список в качестве «источника» для запроса, который разделит его на строки, а затем использовать этот CTE в качестве «источника № 2» для вашего текущего запроса.
Что-то вроде этого:
with list (col) as
-- this is your list
(select q'['1999', '1998', '1997']'
from dual
),
splist as
-- list, split to rows
(select trim(regexp_substr(col, '[^,] ', 1, level)) val
from list
connect by level <= regexp_count(col, ',') 1
)
-- OK, now we're set to use it
select l.cod
from list l
where l_cod in (select val from splist) --> it is used here
union
select l.cod
from list l join blabla on a = b
where l.cod in (select val from splist); --> and here