将带有 ROWNUM 的 Oracle SQL 查询迁移到 PostgreSQL HQL 查询

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

我有以下 Oracle SQL 查询:

SELECT user FROM global_users user WHERE user.status = 'ACTIVE'
AND user.description IS NOT NULL AND user.updatedGoodsDate BETWEEN '2024-03-10 20:09:53' AND '2024-03-10 20:09:53'
AND ROWNUM <= 13

我尝试使用 Spring Data JPA 将查询编辑到 Postgres 中:

    @Query("SELECT user FROM global_users user WHERE user.status = :status
    AND user.description IS NOT NULL AND user.updatedGoodsDate BETWEEN :startDate AND :endDate")
    List<Users> findTopUsers(@Param("status") TransactionStatus status,
      @Param("startDate") OffsetDateTime start, @Param("endDate") OffsetDateTime end, @Param("count") long count);

但是我不能在 Postgre 中使用 LIMIT 子句。有什么方法可以编辑查询并获得相同的结果吗?

例如可以用子查询来实现吗?

测试项目:https://github.com/rcbandit111/oracle_rownum_pg_migration_poc/blob/main/src/main/java/com/test/portal/account/platform/repository/DataRepository.java

sql postgresql hql
1个回答
0
投票

从 Oracle 12 和 PostgreSQL 13 开始,两个 RDBMS 都支持

FETCH FIRST n ROWS ONLY
语法:

SELECT "USER"
FROM   global_users
WHERE  status = 'ACTIVE'
AND    description IS NOT NULL
AND    updatedGoodsDate BETWEEN TIMESTAMP '2024-03-10 20:09:53'
                            AND TIMESTAMP '2024-03-10 20:09:53'
-- ORDER BY something
FETCH FIRST 13 ROWS ONLY

对于样本数据:

CREATE TABLE global_users (
  "USER" VARCHAR(10),
  status VARCHAR(8),
  description VARCHAR(20),
  updatedGoodsDate TIMESTAMP
)

INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Alice', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Beryl', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Carol', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Debra', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Emily', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Fiona', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Grace', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Haley', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Irene', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Julie', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Kelly', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Lydia', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Megan', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');
INSERT INTO global_users ("USER", status, description, updatedGoodsDate)
VALUES ('Naomi', 'ACTIVE', 'X', TIMESTAMP '2024-03-10 20:09:53');

输出:

用户
爱丽丝
绿柱石
卡罗尔
黛布拉
艾米丽
菲奥娜
格蕾丝
海莉
艾琳
朱莉
凯莉
莉迪亚
梅根

Oracle 小提琴 PostgreSQL 小提琴

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