powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PL/pgSQL. Как в получить поле записи в цикле?
9 сообщений из 9, страница 1 из 1
PL/pgSQL. Как в получить поле записи в цикле?
    #39904639
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица с 43 однотипными именами (a1, a2,..)
Пробую перебрать их вот так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE
_r record       ;
_i integer      ; -- счетчик полей
_f varchar(8)   ; -- имя поля
_v varchar(255) ; -- значение поля

BEGIN

for _r in select * from tmp
loop
  for _i in 0..42 loop
    _f = 'a' || _i ; -- имя поля
    _v = _r._f ;   -- значение поля
    raise notice '% = %', _f, _v ;
  end loop;
end loop;

return 0 ;


Ругается на строку:
_v = _r._f ;

Знаю, что нужно тут вместо переменной писать имя поля, но ломает 43 раза писать
одно и тоже.

Вопрос как это обойти?

В гугле не нашел, а здесь на форуме давно было сказано, вроде в 9.0 должны были
такую возможность дать, но я в документации не нашел,
хотя уже 10 вышла, но я пока на 9.6.
...
Рейтинг: 0 / 0
PL/pgSQL. Как в получить поле записи в цикле?
    #39904958
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На Ваш вопрос не отвечу, но у Вас первое обращение идет к 'a0', а последние к 'a42'.
...
Рейтинг: 0 / 0
PL/pgSQL. Как в получить поле записи в цикле?
    #39905234
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, но суть не в этом.

В строке _v = _r._f ;
_r - это объект - очередная строка таблицы
_f - имя поля

Обычно пишут так: _r.a1 или _r.a2 ...
но делать так 40 раз как-то не очень - а на переменную _f он ругается ((

Не пойму как сделать, должен быть какой-то способ, кто-нибудь подскажет?
...
Рейтинг: 0 / 0
PL/pgSQL. Как в получить поле записи в цикле?
    #39905264
GeniyZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
an2k,

поможет вам динамический SQL.

как-то так:
Код: sql
1.
   execute 'select '||_f||' from TMP where id='||_r.id into _v;
...
Рейтинг: 0 / 0
PL/pgSQL. Как в получить поле записи в цикле?
    #39905364
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k
Да, но суть не в этом.

В строке _v = _r._f ;
_r - это объект - очередная строка таблицы
_f - имя поля

Обычно пишут так: _r.a1 или _r.a2 ...
но делать так 40 раз как-то не очень - а на переменную _f он ругается ((

Не пойму как сделать, должен быть какой-то способ, кто-нибудь подскажет?


если не хочется мучаться с динамо, то можно медитировать в такую сорону :

Код: sql
1.
2.
3.
select t.id, jk, j ->jk from mytable t ,lateral to_jsonb( (t.*)) j
,lateral jsonb_object_keys(j) jk
order by 1,2

...
Рейтинг: 0 / 0
PL/pgSQL. Как в получить поле записи в цикле?
    #39906111
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
Вот это, честно, не понял, ладно придется тупо перечислить 43 раза ((

Спасибо все, кто пытался помочь.
...
Рейтинг: 0 / 0
PL/pgSQL. Как в получить поле записи в цикле?
    #39906149
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k,

Код: plsql
1.
execute 'select ($1).' || _f  into _v using _r;



Блин оно же даже в stackoverflow есть... неужели так тяжело погуглить? :(

ps: если у вас возникла такая задача - скорее всего у вас что то не так с дизайном базы.
Вероятнее всего вместо 43 однотипных полей нужен массив из 43 элементов с нормальным доступом.
Или json(b) / hstore.
...
Рейтинг: 0 / 0
PL/pgSQL. Как в получить поле записи в цикле?
    #39906164
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k
qwwq,
Вот это, честно, не понял<>


замените "майтейбл" на "ётейбл" и помедитируйте на результат
...
Рейтинг: 0 / 0
PL/pgSQL. Как в получить поле записи в цикле?
    #39906216
Victor Nevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоечники )
JSON
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SELECT version();
DROP TABLE IF EXISTS tb_temp ;
CREATE TEMP TABLE tb_temp (id serial, f1 varchar, f2 varchar, f3 varchar, f4 varchar, f5 varchar, f6 varchar, f7 varchar, f8 varchar, f9 varchar, f10 varchar);

INSERT INTO tb_temp (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10)(
       select random(), random(), random(), random(), random(), random(), random(), random(), random(), random()
  FROM generate_series(1, 5));


----JSON
DO $$
DECLARE 
 _r record;
 _i int;
 _f varchar;
 _v varchar;
BEGIN
 FOR _r IN (SELECT row_to_json(t.*) AS j
              FROM tb_temp t)
 LOOP
   FOR _i IN 1..5
   LOOP
     _f := 'f'||_i;
     _v:= _r.j->> _f;

     RAISE NOTICE '% = %', _f, _v ;
     
   END LOOP;
 END LOOP;
END $$; 

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
SET
                           version
--------------------------------------------------------------
 PostgreSQL 9.6.16, compiled by Visual C++ build 1800, 32-bit
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f1 = 0.591201948933303
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f2 = 0.754032891243696
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f3 = 0.119412035681307
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f4 = 0.0746557605452836
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f5 = 0.268979582935572
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f1 = 0.656033039093018
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f2 = 0.515986034180969
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f3 = 0.88728362461552
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f4 = 0.435155564919114
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f5 = 0.441897288896143
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f1 = 0.821475957520306
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f2 = 0.694702245760709
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f3 = 0.856249616015702
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f4 = 0.584224978927523
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f5 = 0.855191850103438
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f1 = 0.683314533438534
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f2 = 0.0492879105731845
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f3 = 0.77426835289225
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f4 = 0.128884520381689
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f5 = 0.320722579024732
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f1 = 0.404171647038311
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f2 = 0.807787640020251
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f3 = 0.851054939441383
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f4 = 0.662051108200103
psql:test20191209json.sql:33: ЗАМЕЧАНИЕ:  f5 = 0.334588025696576

EXECUTE
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
----EXECUTE
DO $$
DECLARE 
 _r record;
 _i int;
 _f varchar;
 _v varchar;
BEGIN
 FOR _r IN (SELECT *
              FROM tb_temp t)
 LOOP
   FOR _i IN 1..5
   LOOP
     _f := 'f'||_i;

     EXECUTE 'SELECT (($1::text)::tb_temp).' || _f INTO _v USING _r;

     RAISE NOTICE '% = %', _f, _v ;
     
   END LOOP;
 END LOOP;
END $$; 

psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f1 = 0.0499203437939286
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f2 = 0.125165605917573
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f3 = 0.0765905892476439
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f4 = 0.662871616426855
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f5 = 0.778731087222695
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f1 = 0.0814210381358862
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f2 = 0.826806105207652
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f3 = 0.300207323860377
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f4 = 0.946426101028919
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f5 = 0.0437120264396071
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f1 = 0.59994939994067
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f2 = 0.260397961828858
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f3 = 0.773129916284233
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f4 = 0.245339550543576
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f5 = 0.282598315738142
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f1 = 0.484617314767092
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f2 = 0.673762732185423
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f3 = 0.312586843501776
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f4 = 0.592565366998315
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f5 = 0.912156303413212
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f1 = 0.192995287012309
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f2 = 0.210349347442389
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f3 = 0.163711720146239
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f4 = 0.133532638195902
psql:test20191209execute.sql:34: ЗАМЕЧАНИЕ: f5 = 0.818814854137599
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PL/pgSQL. Как в получить поле записи в цикле?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]