powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция, результат в новый запрос
6 сообщений из 6, страница 1 из 1
Функция, результат в новый запрос
    #40135268
TheKLF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Есть такой вопрос:

Сразу уточню, что я не уверен в правильности самой концепции БД, но выглядит она следующим образом:
Есть пару таблиц, в них совершенно разрозненные данные, из общего у них допустим один или два атрибута(столбца)
Я создал ещё одну таблицу (Общая), в которой я буду хранить значения и в этой же таблице будет один атрибут - поле типа jsonb , в котором буду хранить id записи значения и название этой таблицы

Код: javascript
1.
{'id': некий номер, 'nameTable': название таблицы}



Эта Общая таблица будет выглядеть так:

Код: javascript
1.
2.
3.
---------------------------------
| id | some value | json field |
---------------------------------



Теперь я хочу выполнить поиск в some value и раскрасить поле jsonb и сделать следующие запросы, чтобы получить остальные данные из тех таблиц, где есть совпадение с some value

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DO
$$
DECLARE
    table_string RECORD;
    query_string RECORD ;
    query_string_2 text;
BEGIN
-- цикл
FOR table_string IN SELECT * FROM public."Global" WHERE someValue ='что-то ищем' --query_string
LOOP
   -- какой-то код
   raise notice '%', table_string.json['nameTable'];
   raise notice '%', table_string.json['id'];
   
END LOOP;
END;
$$
LANGUAGE plpgsql;



PG мне показывает названия таблиц, и номер записи в таблице, где есть someValue
А вот как мне сформировать запрос с использованием этих двух значений, чтобы получить окончательные записи?

Как правильно скомпоновать строку используя значения json?
если выполняю такой код, строка выглядит правильно
Код: plsql
1.
raise notice 'SELECT * FROM public.% WHERE id_csv=%', table_string.json['nameTable'], table_string.json['id'];



Код: plsql
1.
SELECT * FROM public."Some_Name_Table" WHERE id="7"



но как это записать в переменную и потом выполнить запрос используя эту переменную я не понял

пробую:

Код: plsql
1.
query_string_2 := 'SELECT * FROM public.% WHERE id_csv=%', table_string.json['nameTable'], table_string.json['id'];



получаю ошибку

Я ещё допустил ошибку и здесь table_string.json['id'] у меня получается значение в " " (двойные кавычки), а как можно сделать ' ' преобразовать в одинарные?

Спасибо!
...
Рейтинг: 0 / 0
Функция, результат в новый запрос
    #40135271
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TheKLF,

Сначала читаем теорию и еще тут что бы понять что происходит


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare 
  curs1 refcursor;
  mydata record;
begin
  OPEN curs1 FOR EXECUTE format('SELECT * FROM public.%I WHERE id_csv=%s', table_string.json['nameTable'], table_string.json ->>'id');
  loop
    fetch curs1 into mydata;
    exit when not found;
    --...  mydata.id
  end loop;
  close curs1 ;
end;


...
Рейтинг: 0 / 0
Функция, результат в новый запрос
    #40135273
TheKLF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111, Огромное спасибо!!!!

Я это всё читал, но ваш пример уложил всё по полочкам в моей голове.

Код: plsql
1.
   query_string_2 := format ('SELECT * FROM public.%I WHERE id_csv=%L;', table_string.json->>'nameTable', table_string.json->>'id'::text);



%L - заключает значение аргумента в апострофы, а ещё table_string.json->>'id'::text приведение типа ускоряет работу


а вот ещё такой вопрос: возможно ли каждую строку превратить в JSON используя имена атрибутов таблицы в качестве ключей и полученные значения? И как это сделать?
...
Рейтинг: 0 / 0
Функция, результат в новый запрос
    #40135277
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TheKLF,

Оператор ->> уже возвращает результат с типом текст, дополнительно преобразовывать не нужно.

Да, запись с типом record можно перевести c помощью функций to_json или to_jsonb

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare 
  jvData jsonb;
begin
  --...
    fetch curs1 into mydata;
    exit when not found;
    jvData := to_jsonb(mydata);
  --...
end;
...
Рейтинг: 0 / 0
Функция, результат в новый запрос
    #40135278
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TheKLF,
Может поможет такая функция 22428615
...
Рейтинг: 0 / 0
Функция, результат в новый запрос
    #40135279
TheKLF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swa111,

и ещё раз Огромное Спасибо!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция, результат в новый запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (1), Yandex Bot 9 мин.
Пользователи онлайн (7): Анонимы (5), Bing Bot, Yandex Bot 2 мин.
x
x
Закрыть


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