Необходимо использовать переменную в функции postgres plpg sql, чтобы получить количество строк предыдущего запроса? - PullRequest
1 голос
/ 25 апреля 2020

В функциях plpg sql вы можете использовать IF (FOUND), чтобы узнать, сколько результатов было получено в предыдущем запросе. Есть ли эквивалент для получения количества строк из предыдущего запроса, например, IF (ROW_COUNT > 5)? Или вам всегда нужно использовать переменную для хранения этого значения перед его проверкой?

Например, это единственные опции?

-- option 1
select count(*) from mytable into thecount;
if (thecount > 5) ...

-- option 2
select * from mytable;
GET DIAGNOSTICS thecount = ROW_COUNT;
if (thecount > 5) ...

Я пропустил какие-либо другие опции для получения количества строк предыдущего запроса?

Какой из доступных вариантов является рекомендуемым для получения количества строк и почему?

1 Ответ

0 голосов
/ 25 апреля 2020
if (select count(*) > 5 from mytable) then ...
if (select count(*) from mytable) > 5 then ...

или более смешной

if 5 < count(*) from mytable then ...

select * from mytable; является недопустимым plpgsql утверждением, поэтому ROW_COUNT не подходит для этого случая.

Обычно ROW_COUNT используется чтобы получить число строк , обработанное предыдущим оператором (вставка, обновление, удаление).


Обновление

Если вы не ' Точное количество строк не нужно, но нужно только проверить, больше или меньше его значение, более эффективный способ таких проверок:

select count(*) > 5 from (select 1 from mytable limit 6) as t(x);
# create table mytable(id bigserial not null primary key, x numeric);
# insert into mytable(x) select random() from generate_series(1,10000000) as a;
# explain analyze select count(*) > 5 from mytable;
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                                                  QUERY PLAN                                                                   │
├───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Finalize Aggregate  (cost=116777.88..116777.89 rows=1 width=1) (actual time=348.815..348.815 rows=1 loops=1)                                  │
│   ->  Gather  (cost=116777.66..116777.87 rows=2 width=8) (actual time=348.713..368.395 rows=3 loops=1)                                        │
│         Workers Planned: 2                                                                                                                    │
│         Workers Launched: 2                                                                                                                   │
│         ->  Partial Aggregate  (cost=115777.66..115777.67 rows=1 width=8) (actual time=328.703..328.703 rows=1 loops=3)                       │
│               ->  Parallel Seq Scan on mytable  (cost=0.00..105361.13 rows=4166613 width=0) (actual time=0.013..211.543 rows=3333333 loops=3) │
│ Planning Time: 0.080 ms                                                                                                                       │
│ JIT:                                                                                                                                          │
│   Functions: 8                                                                                                                                │
│   Options: Inlining false, Optimization false, Expressions true, Deforming true                                                               │
│   Timing: Generation 1.422 ms, Inlining 0.000 ms, Optimization 0.484 ms, Emission 9.246 ms, Total 11.152 ms                                   │
│ Execution Time: 369.318 ms                                                                                                                    │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Time: 369,740 ms

# explain analyze select count(*) > 5 from (select 1 from mytable limit 6) as t(x);
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                                                       QUERY PLAN                                                       │
├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Aggregate  (cost=0.17..0.19 rows=1 width=1) (actual time=0.020..0.020 rows=1 loops=1)                                  │
│   ->  Limit  (cost=0.00..0.10 rows=6 width=4) (actual time=0.013..0.015 rows=6 loops=1)                                │
│         ->  Seq Scan on mytable  (cost=0.00..163693.71 rows=9999871 width=4) (actual time=0.012..0.013 rows=6 loops=1) │
│ Planning Time: 0.104 ms                                                                                                │
│ Execution Time: 0.046 ms                                                                                               │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Time: 0,507 ms

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...