查询 JSONB 数组长度可变的 select 行

Query to select rows where JSONB arrays have variable lengths

我有一个 table (t),其中包含一列 (c) JSONB 对象,每个对象包含一个长度可变的数组 (a) 1-10(含)之间。我需要构建一个查询,从 t 中选择 1000 行,其中 c 包括 100 行 每个 可能长度 a。编写此查询最简洁的方法是什么?我当前的查询结构如下所示:

WITH length_1 AS (
    SELECT *
    FROM t
    WHERE JSONB_ARRAY_LENGTH(c -> 'a') = 1
    ORDER BY RANDOM()
    LIMIT 100
),
length_2 AS (
    SELECT *
    FROM t
    WHERE JSONB_ARRAY_LENGTH(c -> 'a') = 2
    ORDER BY RANDOM()
    LIMIT 100
)
...
SELECT *
FROM length_1
UNION
SELECT *
FROM length_2
...

您可以使用 window 函数在其分区内用行号标记每一行,然后使用外部 select 将每个分区限制为 100。

select * from (
    select t.*, row_number() over (partition by jsonb_array_length(c->'a') order by random()) as rn from t
) foo  where rn<=100;

这两个级别是必需的,因为您不能在 WHERE 或 HAVING 中使用 window 函数。