0

我有一个很长的查询,会产生一些值。标识符名称太长。而且我更喜欢将结果集放在名为“列名”和“列值”的 2 列中。

我想要的以下查询的 IE:

column name               column value
forn_old_codice_fornitura ***
VOF_VOCE_FATTURABILE_COD  ***
IEF_ASSOGGETTAMENTO_COD   ***

*** 是实际值。

我能怎么做?

SELECT 
      forn.forn_old_codice_fornitura,

'列描述 1'、VOF.VOF_VOCE_FATTURABILE_COD、'列描述 2'、IEF_ASSOGGETTAMENTO_COD "Cod Assog Neta"、'列描述 3' [...]

4

1 回答 1

5

由于您使用的是 Oracle 11g,因此您可以使用该UNPIVOT功能。这将获取您的列并将它们转换为行:

select col_name , col_value
from
(
  SELECT 
        forn.forn_old_codice_fornitura,
         VOF.VOF_VOCE_FATTURABILE_COD,
         IEF_ASSOGGETTAMENTO_COD,
         ETA.ETA_CODICE_ASSOG,
         CLU.CLU_CLASSE_FORNITURA_COD,
         MVI.CLU_CLASSE_FORNITURA_COD,
         ETA.ETA_USO_CLASSE_FORN,
         MVI.MVI_FLG_SOGGETTO,
         ETA.ETA_FLG_SOGGETTO,
  [...]
) 
unpivot
(
  col_value
  for col_name in (forn_old_codice_fornitura, VOF_VOCE_FATTURABILE_COD,
                   IEF_ASSOGGETTAMENTO_COD, ETA_CODICE_ASSOG, ...)
) 

编辑,根据您想要使用列的长名称生成列描述的评论,有两种方法可以做到这一点。

一,您可以使用一个CASE表达式,将 替换为col_name您想要的列描述,类似于:

select col_name, 
  col_value,
  case col_name
    when 'col1' then 'Test Col 1'
    when 'col2' then 'Test Col 2'
    when 'col3' then 'Test Col 3'
    when 'col4' then 'Test Col 4'
  end col_desc
from yourtable
unpivot
(
  col_value
  for col_name in (col1, col2, col3, col4)
) unp;

或者,您可以创建一个包含从col_name到列描述的转换的表,并将该表连接到 unpivot 结果:

select d.col_name,
  d.col_value,
  cd.col_desc
from
(
  select col_name, 
    col_value
  from yourtable
  unpivot
  (
    col_value
    for col_name in (col1, col2, col3, col4)
  ) unp
) d
inner join cd
  on d.col_name = cd.col_name

参见SQL Fiddle with Demo

于 2013-03-27T14:51:39.530 回答