избавиться от нескольких select при jsonb

crause
Дата: 10.04.2015 15:53:04
Помогите с запросом.
как заменить 5 селектов на один?

DECLARE
RESULT jsonb;
p1 bigint;
p2 boolean;
p3 text;
p4 text;
p5 text;
BEGIN
 IF $1 IS NOT NULL THEN 
  SELECT value into p1 FROM jsonb_each_text($1) where key = 'par1';
  SELECT value into p2 FROM jsonb_each_text($1) where key = 'par2';
  SELECT value into p3 FROM jsonb_each_text($1) where key = 'par3';
  SELECT value into p4 FROM jsonb_each_text($1) where key = 'par4';
  SELECT value into p5 FROM jsonb_each_text($1) where key = 'par5';
p2.
Дата: 10.04.2015 16:13:27
crause
как заменить 5 селектов на один?
а зачем атрибуты "объекта" растаскивать на отдельные переменные, да еще через селект.
crause
Дата: 10.04.2015 16:55:42
p2.
crause
как заменить 5 селектов на один?
а зачем атрибуты "объекта" растаскивать на отдельные переменные, да еще через селект.


для читабельности кода в дальнейшем.

как можно по другому? значения эти идут в update и в insert
p2.
Дата: 10.04.2015 17:15:41
crause
для читабельности кода в дальнейшем.
читаблядство субъективный критерий. Разыменование объекта при дальнейшей модификации исходного json потребует копирования изменений по декларациям и переприсваиваниям переменных и может привести к труднодиагностируемым ошибкам.

do language plpgsql $anon$
declare
   j jsonb := '{"a":"xxx", "b":123}'::jsonb;
   a text;
   b integer;   
begin
   --синтаксически без селекта
   a := j->>'a';
   b := j->'b';
   raise notice 'a=% b=%', a, b;
   --одним селектом
   select * into a, b
      from jsonb_to_record(j) as t (a text, b integer);
   raise notice 'a=% b=%', a, b;
end;
$anon$

ЗАМЕЧАНИЕ:  a=xxx b=123
ЗАМЕЧАНИЕ:  a=xxx b=123