powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос with с массивом данных
6 сообщений из 6, страница 1 из 1
запрос with с массивом данных
    #40069537
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе всем утро.

Все помешались на сложных SQL запросах.
Я всегда делал через курсоры, но вот решил сделать через запрос.
Есть таблица, в ней есть поле с массивом цифр. Этот массив цифр соответствует id в другой таблице.
К примеру '{2,4}' равны Id=2 и id=4 (учетным записям в другой таблице).

Если делать вот так
Код: sql
1.
2.
3.
4.
5.
6.
with aaa as (
 select комп_оператор_месторожд as oper  
 from tablitci_a.a_mestorojdinia where id=5
 )
 SELECT * FROM tablitci_a.v_vladeletc_mestorojd as bbb, aaa as ccc 
 WHERE bbb.id in (2, 4);



Где (2, 4) - это массив числе с id из другой таблицы
то результат возвращается:
Код: sql
1.
2.
2 | 2021-04-19    |                 | тест_Лукойл          | Россия | Тюменский  к примеру регин |              33 | 9876543210 | 10000000010000 | г. Москва, но уже на севере |      3333333333 | test_lukoil@ya.ru  | {"город": "тест_город", "директор": "директор фио", "тест_поле2": "значение тестового поля 2"} | связь по реквизитам | Петров Петр Петрович тел 333333333333 | https://energybase.ru/oil-gas-field | {2,3,5}              | {2,4}
  4 | 2021-04-20    |                 | тест_Новатэк         | Россия | Тюменский  к примеру регин |              64 | 1200000000 |  2000000000000 | г. Алушта, Крым             |      1133333333 | test_novatek@ya.ru | {"город": "тест_Алушта", "директор": "Директор НОВАТЭК фио", "тест_поле2": "значение 3"}       | связь по реквизитам | Сидоров Евгений 222-333-444-7         | https://energybase.ru/oil-gas-field | {4,5}                | {2,4}



**************************
А если делать вот так:
Код: sql
1.
2.
3.
4.
5.
6.
with aaa as (
 select комп_оператор_месторожд as oper  
 from tablitci_a.a_mestorojdinia where id=5
 )
 SELECT * FROM tablitci_a.v_vladeletc_mestorojd as bbb, aaa 
 WHERE bbb.id in (array_to_string(oper,','));



То выводит ошибку:
Код: sql
1.
2.
3.
4.
ОШИБКА:  оператор не существует: integer = text
СТРОКА 6:  WHERE bbb.id in (array_to_string(oper,','));
                        ^
ПОДСКАЗКА:  Оператор с данными именем и типами аргументов не найден. Возможно, вам следует добавить явные приведения типов.



Делал и так
Код: sql
1.
2.
3.
4.
5.
6.
7.
with aaa as (
 select комп_оператор_месторожд as oper  
 from tablitci_a.a_mestorojdinia where id=5
 )
 SELECT * FROM tablitci_a.v_vladeletc_mestorojd as bbb, aaa as ccc 
 WHERE bbb.id in (array_to_string(oper,',')::integer);
ОШИБКА:  неверный синтаксис для типа integer: "2,4"



и так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with aaa as (
 select комп_оператор_месторожд as oper  
 from tablitci_a.a_mestorojdinia where id=5
 )
 SELECT * FROM tablitci_a.v_vladeletc_mestorojd as bbb, aaa as ccc 
 WHERE bbb.id in (array_to_string(oper,','))::integer;
ОШИБКА:  оператор не существует: integer = text
СТРОКА 6:  WHERE bbb.id in (array_to_string(oper,','))::integer;
                        ^
ПОДСКАЗКА:  Оператор с данными именем и типами аргументов не найден. Возможно, вам следует добавить явные приведения типов.




Может у кого есть какое мнение на этот счет.
Меня то все устраивает через циклы с курсором и быстро по работе коде и быстро по написанию кода, но народ хочет SQL запрос.

.
...
Рейтинг: 0 / 0
запрос with с массивом данных
    #40069540
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,

вроде так
Код: sql
1.
2.
3.
4.
5.
6.
with aaa as (
 select комп_оператор_месторожд as oper  
 from tablitci_a.a_mestorojdinia where id=5
 )
 SELECT * FROM tablitci_a.v_vladeletc_mestorojd as bbb, aaa as ccc 
WHERE bbb.id in any(ccc.oper);
...
Рейтинг: 0 / 0
запрос with с массивом данных
    #40069544
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и так
Код: sql
1.
WHERE bbb.id in any(oper);



и так
Код: sql
1.
WHERE bbb.id in any (array_to_string(oper,',')::integer);



и так
Код: sql
1.
WHERE bbb.id in any(ccc.oper);



везде один итог:
Код: sql
1.
ОШИБКА:  ошибка синтаксиса (примерное положение: "any")



.
...
Рейтинг: 0 / 0
запрос with с массивом данных
    #40069549
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,
Код: sql
1.
WHERE bbb.id = any(oper)
...
Рейтинг: 0 / 0
запрос with с массивом данных
    #40069550
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы разницу между
id in (1,2,3) и id in ('1,2,3') видите? Вам который нужен? Так почему вы упорно пытаетесь сделать второй из них? И удивляетесь, почему это он вдруг неверный?

id in (1,2,3) это id = ANY (array[1,2,3])
Массив у вас уже и так есть, к чему с ним ещё что-то делать?
bbb.id = any(oper)
...
Рейтинг: 0 / 0
запрос with с массивом данных
    #40069568
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,
Я знал что массив есть, но в голову только шла команда IN

Код
Код: sql
1.
2.
3.
4.
5.
6.
7.
with aaa as (
oilgaz(#  select комп_оператор_месторожд as oper  
oilgaz(#  from tablitci_a.a_mestorojdinia where id=5
oilgaz(#  )
oilgaz-#  SELECT * FROM tablitci_a.v_vladeletc_mestorojd as bbb, aaa 
oilgaz-#  WHERE bbb.id =any(oper);
Оказался рабочим.


Всем спасибо!
Код: sql
1.
2.
2 | 2021-04-19    |                 | тест_Лукойл          | Россия | Тюменский  к примеру регин |              33 | 9876543210 | 10000000010000 | г. Москва, но уже на с         | {2,4}
  4 | 2021-04-20    |                 | тест_Новатэк         | Россия | Тюменский  к примеру регин |              64 | 1200000000 |  2000000000000 | г. Алушта, Крым             |   


Время: 0,368 мс
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос with с массивом данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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