【问题标题】:Is it possible to select all columns in SQL but only selecting for every third row?是否可以选择 SQL 中的所有列但只选择每第三行?
【发布时间】:2021-04-15 05:16:21
【问题描述】:

我想选择所有列,但每 X 行都会选择每一行。

例如,如果我想选择所有行,这样写:

@Transactional
@Query(value = "SELECT * FROM data WHERE job_name = :jobName ORDER BY date_time ASC LIMIT :selectedLimit OFFSET :selectedOffset" , nativeQuery = true)
List<Data> findByJobNameOrderByDateTimeAscLimit(@Param("jobName") String jobName, @Param("selectedOffset") long selectedOffset, @Param("selectedLimit") long selectedLimit);

但我想用“每 X 行”或类似的东西来扩展它。这可能吗?

【问题讨论】:

    标签: java sql spring-boot jpa spring-data-jpa


    【解决方案1】:

    您可以在调用代码中添加此流,例如:

        int count[] = new int[1];
        List<Data> collect = dataList.stream()
                .peek(s -> count[0]++)
                .filter(s -> count[0] % 3 != 0)
                .collect(Collectors.toList());
    

    “3”是你的“selectedLimit”

    此外,您可以使用此代码创建一个通用 utils 方法,并将您的 findByJobNameOrderByDateTimeAscLimit 包装在您的服务中,并使用示例中的帮助代码获取和过滤 List&lt;Data&gt;

    【讨论】:

    • 啊。你的意思是我在Java代码中这样做?不是 MySQL 代码?
    【解决方案2】:

    使用java代码过滤器的方法会选择所有数据并对其进行过滤,这不是很有效。

    如果您想使用 SQL 来实现 - 查询将取决于您使用的方言。

    例如在 Oracle 中 - 可以使用 ROWNUM,例如:

    select *
      from (select ROWNUM as rn, t.*
            from Table t)
    WHERE MOD(rn, 3) = 0 
    

    在上面的代码中 - 您的问题中的“3”是“X”,这意味着“将选择每 3 行”

    如果您的结果中不需要“RN” - 在上层查询中使用 Select t.*

    如果您的数据库方言不支持 ROWNUM - 您可以使用包装查询自己添加它,以下问题应该让您知道如何做到这一点: When i am using it with db2 for pagination, my next page is giving error

    【讨论】:

    • 我可以这样用吗SELECT * FROM data WHERE job_name = :jobName AND (select ROWNUM as rn, t.* from Table t) WHERE MOD(rn, 3) = 0 ORDER BY date_time ASC LIMIT :selectedLimit OFFSET :selectedOffset
    • 这一定是更简单的方法吗?
    • 这样的东西应该可以工作SELECT t.* FROM (select ROWNUM as rn, t.* from Table t) WHERE job_name = :jobName AND MOD(rn, 3) = 0 ORDER BY date_time ASC LIMIT :selectedLimit OFFSET :selectedOffset
    • 顺便说一句。我使用的是 MySQL。
    • 现在发现了一些东西。这只能打印出行号SELECT * FROM (SELECT @row := @row + 1 AS rownum FROM (SELECT @row := 0) r, data) RANKED WHERE rownum % 2 = 1;
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2017-02-24
    • 2020-11-10
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多