oracle 使用R2DBC筛选查询

xytpbqjk  于 2022-11-22  发布在  Oracle
关注(0)|答案(3)|浏览(441)

我需要使用一些查询参数进行过滤查询。我需要如果查询参数为空,则不计算查询条件(例如,=LIKE),并返回所有内容。我正在使用R2DBC,但我找不到解决方法。

zwghvu4y

zwghvu4y1#

如果 您 使用 的 是 Spring Data R2dbc , 除了 上面 的 原始 SQL 查询 , 您 还 可以 使用 R2dbcOperations 按 条件 自由 组合 Criteria
下面 是 一 个 示例 。

template
    .select(Post.class)
    .matching(
         Query
            .query(where("title").like("%" + name + "%"))// extract where here you can assemble the query condition freely.
            .limit(10)
            .offset(0)
     )
    .all();

中 的 每 一 个
此外 , 使用 R2dbcRepository 和 基于 约定 的 方法 , 尝试 在 like 中 使用 默认 值 ( 例如 , 在 like 中 将 null 设置 为 空 字符 串 "" ) , 以 节省 确定 SQL 中 是否 为 null 值 的 工作 。

a0x5cqrl

a0x5cqrl2#

一个一般性的准备好的陈述可能是:

SELECT *
FROM yourTable
WHERE col = ? or ? IS NULL;

如果将NULL值绑定到模糊层中的?,则WHERE子句将始终为true,并返回表中的所有记录。

wlzqhblo

wlzqhblo3#

如果 您 更 喜欢 使用 " 静态 SQL 语句 " ( 意味 着 您 对 所有 可能 的 绑定 值 使用 单个 SQL 字符 串 ) 来 执行 此 操作 , 那么 在 Oracle 中 , 它 可能 是 optimal to use NVL() to profit from an Oracle optimiser feature, as explained in this article , 而 不管 您 是否 使用 R2DBC :

SELECT *
FROM t
WHERE col = nvl(:bind, col)

中 的 每 一 个
但是 , 像 您 这样 的 查询 通常 最 好 使用 dynamic SQL, such as supported by a third party library like jOOQ 来 实现 :

Flux<TRecord> result =
Flux.from(ctx
        .selectFrom(T)
        .where(bind == null ? noCondition() : T.COL.eq(bind))
     );

格式
很 明显 , 您 也 可以 直接 使用 R2DBC 和 您 自己 的 动态 SQL 库 或 任何 其他 此类 库 来 自己 完成 此 操作 。
免责 声明 : 我 为 jOOQ 背后 的 公司 工作 。

相关问题