使用空值取消PostgreSQL中的IVOT

使用空值取消PostgreSQL中的IVOT,postgresql,Postgresql,我正在做从Oracle到postgres的转换。我有以下问题:在Oracle中,Unpivot会自动删除空值,但postgres会失败。如何使postgres与Oracle相同?您能帮助我吗 甲骨文: with detail as ( select 'A1' as a, 'A2' as b, 'A3' as c, null as d

我正在做从Oracle到postgres的转换。我有以下问题:在Oracle中,Unpivot会自动删除空值,但postgres会失败。如何使postgres与Oracle相同?您能帮助我吗

甲骨文:

with detail as (                
    select          
        'A1' as a,      
        'A2' as b,      
        'A3' as c,      
        null as d       
    from dual           
)               
select * from detail unpivot (              
    agg_value for (agg_name) in (           
        a as 'Max Concurrent Users',        
        b as 'Max Concurrent User Time',        
        c as 'Min Concurrent Users',        
        d as 'Min Concurrent User Time'     
    )           
);
结果Oracle:

博士后:

WITH detail AS (                        
    select                  
        'A1' as a,              
        'A2' as b,              
        'A3' as c,              
        null as d               
)                       
SELECT * FROM (                     
    SELECT 
        unnest(array['Max Concurrent Users', 'Max Concurrent User Time', 'Min Concurrent Users', 'Min Concurrent User Time']) AS agg_name,
        unnest(array[a, b, c, d]) AS agg_value
    FROM
        detail
) foo;
WITH detail (a,b,c,d) AS (                        
  values ('A1', 'A2', 'A3', null)
)                       
SELECT u.*
FROM detail d
  cross join lateral (
    values 
        (a, 'Max Concurrent Users'),
        (b, 'Max Concurrent User Time'),
        (c, 'Min Concurrent Users'),
        (d, 'Min Concurrent User Time')
  ) as u (col, col_name)
where u.col is not null;  
研究生成绩:


您可以按如下方式使用
WHERE
子句:(我已经附加了Oracle查询,您可以在Postgress中使用相同的
WHERE
子句)


我更喜欢对values子句进行横向连接,以便在Postgres中实现unpivot:

WITH detail (a,b,c,d) AS (                        
  values ('A1', 'A2', 'A3', null)
)                       
SELECT u.*
FROM detail d
  cross join lateral (
    values 
        (a, 'Max Concurrent Users'),
        (b, 'Max Concurrent User Time'),
        (c, 'Min Concurrent Users'),
        (d, 'Min Concurrent User Time')
  ) as u (col, col_name)
where u.col is not null;  
如果表中的列名是“可读的”,则可以使用JSON简化此操作:

select u.*
from detail d
  cross join jsonb_each_text(to_jsonb(d)) as u(col_name, col);

你的拼写检查出毛病了吗?您至少在三个位置有“Univot”(缺少“p”)。