Я пытаюсь написать функцию, которая имеет 2 аргумента: один массив целых чисел, и один массив JSONфункция Psql с массивом JSON
пример моего JSON {[{день: 1}, {день : 2}]}
моя функция:
create or replace function ctrl_func(theids integer[],thejsons text[])
RETURNS integer AS \$$
DECLARE
i integer;
tj text[];
BEGIN
FOR i IN 1 .. array_upper(theids, 1)
LOOP
raise notice 'ids %',theids[i];
raise notice 'the jsons %',thejsons[i];
// do other stuff but thejsons fail
END LOOP;
END;
\$$ LANGUAGE plpgsql;
Теперь, я не понимаю, как передать параметр thejsons, я с треском провалился во всех моих испытаниях
Вот что я сделал
select ctrl_func('{66,67}','{{{{day:1},{day:2}}},{{{day:122},{day:222}}}}');
и уведомление.
NOTICE: ids 66
NOTICE: the jsons <NULL>
Я знаю, что я делаю что-то неправильно, это его в прохождении параметра или выбирающего thejsons [I] значения? Я пытаюсь несколько часов изменить, как я передаю слова, гуглинг, как сумасшедший, и я не могу найти ничего, что дало бы мне представление о том, что делать.
Я был бы очень благодарен за любые намеки, указания или объяснения происходящего. Заранее спасибо
Я добавляю все свои заключительные тесты, я упростил, чтобы получить точную проблему. Я, очевидно, пропустил что-то большое - если кто-нибудь может это сделать, я был бы благодарен. Проводил часть ночи и все утро в документах, но результата не было. Вот то, что я до сих пор:
create table tata (json28 jsonb);
insert into tata values('[{"a":2},{"b":3}]');
select * from tata;
json28
----------------------
[{"a": 2}, {"b": 3}]
моя новая функция:
create or replace function trl_toto(thejsons text[]) RETURNS integer AS $$
DECLARE
js1 text;
js text;
BEGIN
raise notice 'the jsons %',thejsons;
raise notice 'the jsons0 %',to_json(thejsons[1]::text);
select regexp_replace(regexp_replace(thejsons[1]::text,'^{{','['),'}}$',']') into js1;
raise notice 'js1 %',js1;
select regexp_replace(regexp_replace(regexp_replace(js1,'^\"',''),'\"$',''),'\\','','g') into js;
raise notice 'js %',js;
update tata set json28=to_json(js)::jsonb;
return 1;
END;
$$ LANGUAGE plpgsql;
Теперь я использую функцию
select trl_toto('{"{{{\"day\":1},{\"day\":2}}}","{{{\"day\":122},{\"day\":222}}}"}');
NOTICE: the jsons {"{{{\"day\":1},{\"day\":2}}}","{{{\"day\":122}, {\"day\":222}}}"}
NOTICE: the jsons0 "{{{\"day\":1},{\"day\":2}}}"
NOTICE: js1 [{"day":1},{"day":2}]
NOTICE: js [{"day":1},{"day":2}]
проверить данные в таблице
select * from tata;
json28
-----------------------------
"[{\"day\":1},{\"day\":2}]"
Как я могу избавиться от первого и последнего " и "? Что не так, когда я пытаюсь ввести js, так как он имеет правильный формат?
' '{{{{день: 1}, {день : 2}}}, {{{day: 122}, {day: 222}}}} 'выглядит как литерал' text', а не 'text []' literal, для меня. Вы пробовали что-то вроде «{» {{{день: 1}, {день: 2}}} "," {{{день: 122}, {день: 222}}} "} ''? – jmelesky
да - теперь я могу видеть слова [i]. Теперь мне нужно выяснить, как преобразовать это в Json, чтобы я мог использовать его в остальной части запроса. будет продолжено в этом направлении для решения проблемы. спасибо за указатель – Pat070
Я все еще не могу много сделать в остальной части моей функции. Я хотел бы использовать моего сына. i sql Я могу сделать: обновить tata set jsoncol = '[{day: 1}, {day: 2}]', и это работает; но в функции я получаю «{{{день: 1}, {день: 2}}}« Как преобразовать »{{в [? (следует ли добавить мои тесты в свой первый вопрос?) – Pat070