【问题标题】:column functions in jooq to split stringsjooq 中用于拆分字符串的列函数
【发布时间】:2019-02-22 23:52:10
【问题描述】:

我正在使用 jooq。我在数据库中有一个包含长字符串的字段。我想将字符串函数应用于 select 语句的返回值,以便在带标签的列中返回值。这是一个例子:

select STAT_NAME, STAT_COUNT, AVERAGE, HALF_WIDTH, SIM_RUN_ID_FK
FROM ACROSS_REP_STAT
where STAT_NAME like '%:Queue%'
ORDER BY STAT_NAME, SIM_RUN_ID_FK;

在上面的查询中,STAT_NAME 是一个很长的字符串。假设我想将返回字符串的一个子字符串提取为一列:

select SUBSTRING(STAT_NAME, 1, 4) AS Something, STAT_NAME, STAT_COUNT, 
  AVERAGE, HALF_WIDTH, SIM_RUN_ID_FK
FROM ACROSS_REP_STAT
where STAT_NAME like '%:Queue%'
ORDER BY STAT_NAME, SIM_RUN_ID_FK;

如何为这样的事情构建一个 jooq 语句?

假设我想使用 DSL 中的 position() 函数来创建索引,例如4 在 substring() 函数变量中。 position() 函数返回一个字段。我很难得到这样的东西:

substring(STAT_NAME, 1, position(STAT_NAME, ":"))

因为 substring() 需要一个 int 而不是 Field


我现在看到我正在使用一个 int 和一个 Field 调用 substring(),并且没有为此的方法签名,但有一个用于

子字符串(字段字段,字段起始位置,字段长度)

如何从 1 开始转为字段?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    org.jooq.impl.DSL 类包含您需要的所有功能。在你的情况下,DSL.substring()。通常,您只需静态导入该类中的所有方法

    import org.jooq.impl.DSL.*;
    

    并使用 SQL 中的函数

    ctx.select(substring(ACROSS_REP_STAT.STAT_NAME, 1, 4).as("Something"), ...)
       .from(...)
       ...
    

    或者,鉴于您更新的问题:

    ctx.select(substring(
            ACROSS_REP_STAT.STAT_NAME, 
            inline(1), 
            position(ACROSS_REP_STAT.STAT_NAME, ":")).as("Something"), ...)
       .from(...)
       ...
    

    【讨论】:

    • 这很有帮助。我更新了我的问题,因为我现在明白了我为此苦苦挣扎的原因。
    • @ManuelRossetti:我已经更新了我的答案。没有DSL.substring() 的重载允许混合intField<? extends Number> 参数。您必须将 int 参数包装在 Field<Integer>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多