Oracle SQL конвертирует одну строку с несколькими столбцами в несколько строк

Я хотел бы выполнить следующий запрос

select '2009042 Restraint 151214.pdf', 
       '2009042 Restraint 170215.pdf',
       '2009042 Restraint 240215.pdf',
       '2009856 Restraint 190215.pdf',
       '208272 Notice 120215.pdf',
       '208272 Restraint 120215.pdf',
       '212598 Restraint 160215.pdf',
       '213195 Notice 130215.pdf'
from   dual

и преобразовать его в запрос, который возвращает столбцы из указанного выше запроса в виде строк. Сводная инструкция, похоже, не в состоянии это сделать.

Поэтому я хотел бы вернуть строки:

COL1
2009042 Restraint 151214.pdf
2009042 Restraint 170215.pdf
2009042 Restraint 240215.pdf
2009856 Restraint 190215.pdf
208272 Notice 120215.pdf
208272 Restraint 120215.pdf
212598 Restraint 160215.pdf
213195 Notice 130215.pdf

Обратите внимание, что есть небольшое отличие от инверсной строки к столбцу

sql,oracle,

1

Ответов: 3


1 принят

Просто отрисуйте запрос в качестве выбора «2009042 Restraint 151214.pdf» из двойного союза, все выберите «2009042 Restraint 170215.pdf» из двойного объединения, все выберите «2009042 Restraint 240215.pdf» из двойного союза, все выберите «2009856 Restraint 190215.pdf», from dual union all select '208272 Notice 120215.pdf' из двойного объединения все выбирают '208272 Restraint 120215.pdf' из двойного объединения всех select '212598 Restraint 160215.pdf' from dual union all select '213195 Извещение 130215.pdf' от двойного в первую очередь:

UNPIVOT

2

Сводная инструкция, похоже, не в состоянии это сделать.

Да, потому что вы не пытаетесь повернуть свои строки в столбцы, вы пытаетесь выбрать * from ( выберите «2009042 Restraint 151214.pdf» v1 , 2009042 Restraint 170215.pdf ' v2 , ' 2009042 Restraint 240215.pdf ' v3 , '2009856 Ограничение 190215.pdf' v4 , '208272 Уведомление 120215.pdf' v5 , '208272 Ограничение 120215.pdf' v6 , '212598 Ограничение 160215.pdf' v7 , '213195 Извещение 130215.pdf' v8 от двойного ) t univot ( col1 для v в ( v1 , v2 , v3 , v4 , v5 , v6 , v7 , v8 ) ) из столбцов в строки.

Если в ваших столбцах был задан определенный набор имен, вы можете использовать UNPIVOTследующее:

V   COL1
--------------------------------
V1  2009042 Restraint 151214.pdf
V2  2009042 Restraint 170215.pdf
V3  2009042 Restraint 240215.pdf
V4  2009856 Restraint 190215.pdf
V5  208272 Notice 120215.pdf
V6  208272 Restraint 120215.pdf
V7  212598 Restraint 160215.pdf
V8  213195 Notice 130215.pdf

Уступая:

select *
from (
  select '2009042 Restraint 151214.pdf', 
         '2009042 Restraint 170215.pdf',
         '2009042 Restraint 240215.pdf',
         '2009856 Restraint 190215.pdf',
         '208272 Notice 120215.pdf',
         '208272 Restraint 120215.pdf',
         '212598 Restraint 160215.pdf',
         '213195 Notice 130215.pdf'
  from   dual
) t
unpivot (
  col1 for v in (
    "'2009042RESTRAINT151214.PDF'", 
    "'2009042RESTRAINT170215.PDF'", 
    "'2009042RESTRAINT240215.PDF'", 
    "'2009856RESTRAINT190215.PDF'", 
    "'208272RESTRAINT120215.PDF'", 
    "'208272NOTICE120215.PDF'", 
    "'212598RESTRAINT160215.PDF'", 
    "'213195NOTICE130215.PDF'"
  )
)

Если таких имен нет, все становится немного более волосатым, но все же выполнимым (возможно, в зависимости от неточно определенных соглашений об именах столбцов в Oracle):

V                               COL1
------------------------------------------------------------
'2009042RESTRAINT151214.PDF'    2009042 Restraint 151214.pdf
'2009042RESTRAINT170215.PDF'    2009042 Restraint 170215.pdf
'2009042RESTRAINT240215.PDF'    2009042 Restraint 240215.pdf
'2009856RESTRAINT190215.PDF'    2009856 Restraint 190215.pdf
'208272RESTRAINT120215.PDF'     208272 Restraint 120215.pdf
'208272NOTICE120215.PDF'        208272 Notice 120215.pdf
'212598RESTRAINT160215.PDF'     212598 Restraint 160215.pdf
'213195NOTICE130215.PDF'        213195 Notice 130215.pdf

Уступая:

UNION ALL

Конечно, если вы все равно готовы писать столько SQL, почему бы просто не использовать UNION ALL, как предложил Гордон


0

Быстрый способ сделать это с помощью следующих из Oracle в системе определяется типом , sys.odcivarchar2list:

select column_value col1 
from table(sys.odcivarchar2list(
       '2009042 Restraint 151214.pdf', 
       '2009042 Restraint 170215.pdf',
       '2009042 Restraint 240215.pdf',
       '2009856 Restraint 190215.pdf',
       '208272 Notice 120215.pdf',
       '208272 Restraint 120215.pdf',
       '212598 Restraint 160215.pdf',
       '213195 Notice 130215.pdf'));

Это возвращает:

COL1                                                                           
--------------------------------------------------------------------------------
2009042 Restraint 151214.pdf                                                    
2009042 Restraint 170215.pdf                                                    
2009042 Restraint 240215.pdf                                                    
2009856 Restraint 190215.pdf                                                    
208272 Notice 120215.pdf                                                        
208272 Restraint 120215.pdf                                                     
212598 Restraint 160215.pdf                                                     
213195 Notice 130215.pdf  

Там, sys.odcinumberlist()если вы хотите использовать числовые значения, а другие документированы в документе Oracle, указанном выше.

SQL, Oracle,
Похожие вопросы