使用空值取消PostgreSQL中的IVOT
我正在做从Oracle到postgres的转换。我有以下问题:在Oracle中,Unpivot会自动删除空值,但postgres会失败。如何使postgres与Oracle相同?您能帮助我吗 甲骨文:使用空值取消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
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”)。