大家好
我需要帮助将 Oracle 查询转换为 PostgreSQL。
在 Oracle SQL 语句下面:
SELECT
MAX ( "KTO_DATUM_ZEIT" ) as "DATUM_UHRZEIT",
SUM ( DECODE ( "KTO_NAME", '49.4711.0001' , KTO_STAND, 0) ) as "Kasse ( # 4711 )",
SUM ( DECODE ( "KTO_NAME", '49.4712.0001' , KTO_STAND, 0) ) as "Kasse ( # 4712 )"
FROM
"TAB_KONTO"
WHERE
(
"KTO_DATUM_ZEIT" BETWEEN
TO_DATE( '07.05.2023 00:00:00', 'DD.MM.YYYY, HH24:MI:SS' ) -- &VONDATUM
AND
TO_DATE( '08.05.2023 00:00:00', 'DD.MM.YYYY, HH24:MI:SS' ) -- &BISDATUM
)
AND
(
"KTO_NAME" = '49.4711.0001' or
"KTO_NAME" = '49.4712.0001'
)
GROUP BY "KTO_DATUM_ZEIT";
图像显示 Oracle 结果。
PostgreSQL 中的 SQL 查询必须如何才能得到相同的结果?
我用case语句还是没能解决问题
这是在 Postgres 中表达查询的一种方式:
select
max(kto_datum_zeit) as datum_uhrzeit,
sum(kto_stand) filter(where kto_name = '49.4711.0001') kasse_4711,
sum(kto_stand) filter(where kto_name = '49.4712.0001') kasse_4712
from tab_konto
where
kto_datum_zeit between date '2023-05-07' and date '2023-05-08'
kto_name in ('49.4711.0001', '49.4712.0001')
group by kto_datum_zeit
对原始查询的更改:
SUM
s可以用Postgres支持的标准FILTER
子句来表达TO_DATE
(注意 Oracle 也支持这种语法)IN
比 OR
短以在列上过滤 KTO_NAME
请注意,我删除了标识符周围的双引号;一般来说,你想避开它们,除非你真的被迫这样做。在 Postgres 中,表名和列名默认为小写,我建议在迁移时坚持这一点。