将 Oracle 查询转换为 PostgreSQL [解码]

问题描述 投票:0回答:1

Result in Oracle, now I'm looking for the same in PostgreSQL

大家好

我需要帮助将 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语句还是没能解决问题

postgresql oracle decode
1个回答
0
投票

这是在 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 中,表名和列名默认为小写,我建议在迁移时坚持这一点。

© www.soinside.com 2019 - 2024. All rights reserved.