Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Как выполнить еще один запрос если первый пустой?  [new]
acidophilus
Member

Откуда:
Сообщений: 120
Добрый день,

есть запрос, в нем несколько полей.

надо чтобы, если запрос не возвращает ничего - выплолнился другой запрос.




Подскажите как это сделать?
29 май 17, 13:28    [20519896]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнить еще один запрос если первый пустой?  [new]
acidophilus
Member

Откуда:
Сообщений: 120
Думал можно так:

SELECT COALESCE( (запрос1), (запрос2));



Но так не работает:



ERROR: subquery must return only one column
SQL-состояние: 42601
Символ: 21
29 май 17, 13:30    [20519898]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнить еще один запрос если первый пустой?  [new]
acidophilus
Member

Откуда:
Сообщений: 120
Так тоже не работает, если ::record добавить:

acidophilus
Думал можно так:

SELECT COALESCE( (запрос1):RECORD, (запрос2));



Но так не работает:



ERROR: subquery must return only one column
SQL-состояние: 42601
Символ: 21
29 май 17, 13:31    [20519904]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнить еще один запрос если первый пустой?  [new]
ursido
Member

Откуда:
Сообщений: 339
acidophilus,

Смысл возвращаемой ошибки немного другой: подзапрос возвращает несколько записей, о чем честно пишет.
Нужно составить запрос, который возвращает не больше одной записи. Быстро и грязно (но неправильно): вписать LIMIT 1 в конце.
29 май 17, 14:00    [20520002]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнить еще один запрос если первый пустой?  [new]
ursido
Member

Откуда:
Сообщений: 339
ursido,

Ой! Должен возвращать одну колонку. Пробуйте так:

SELECT t1 FROM pg_stat_activity t1
29 май 17, 14:02    [20520010]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнить еще один запрос если первый пустой?  [new]
qwwq
Member

Откуда:
Сообщений: 2713
acidophilus
Добрый день,

есть запрос, в нем несколько полей.

надо чтобы, если запрос не возвращает ничего - выплолнился другой запрос.




Подскажите как это сделать?

типы возвратов одинаковые ?

если нет -- придется привести тип к одному (текст например), и парсить уже клиентом.

если да -- то сам запрос как угодно -- через union (надо помыслить, как не делать 2, а не обрезать лимитом), coalesce (rec1,rec2),coalesce (txt1,txt2) ,coalesce (txt1[],txt2[]); [hstore[]|json] или ещё как-то.

давайте сначала определимся с типами.
29 май 17, 14:55    [20520261]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнить еще один запрос если первый пустой?  [new]
acidophilus
Member

Откуда:
Сообщений: 120
qwwq
acidophilus
Добрый день,

есть запрос, в нем несколько полей.

надо чтобы, если запрос не возвращает ничего - выплолнился другой запрос.




Подскажите как это сделать?

типы возвратов одинаковые ?

если нет -- придется привести тип к одному (текст например), и парсить уже клиентом.

если да -- то сам запрос как угодно -- через union (надо помыслить, как не делать 2, а не обрезать лимитом), coalesce (rec1,rec2),coalesce (txt1,txt2) ,coalesce (txt1[],txt2[]); [hstore[]|json] или ещё как-то.

давайте сначала определимся с типами.


типы одинаковые, но запросы разные, как их объединить - не пойму, коалис ведь в рамках одного запроса.
29 май 17, 15:12    [20520354]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнить еще один запрос если первый пустой?  [new]
qwwq
Member

Откуда:
Сообщений: 2713
acidophilus

типы одинаковые, но запросы разные, как их объединить - не пойму, коалис ведь в рамках одного запроса.
а сколько записей вам может вернуть каждый запрос ?

если не больше 1-го, это одно, если по несколько -- это другое (обходится возвратом array-ев типов или hstore, например).

примерное направление мысли :
with a(i,t) AS (values (0,'txt0'),(1,'txt1'),(2,'txt2'))
SELECT coalesce((SELECT array_agg(a) FROM a where NULL),(SELECT array_agg(a) FROM a where true)  )


или даже:
with a(i,t) AS (values (0,'txt0'),(1,'txt1'),(2,'txt2'))
SELECT u.* FROM unnest( coalesce((SELECT array_agg(a) FROM a where NULL),(SELECT array_agg(a) FROM a where true)  ) ) u (i int,t text)


это про coalesce. но, думаю, про union проще

with a(i,t) AS (values (0,'txt0'),(1,'txt1'),(2,'txt2'))

,t as (SELECT a.* FROM a where NULL)
SELECT * FROM t
union all
SELECT a.* FROM a where (select count(1) FROM t) =0
29 май 17, 16:05    [20520589]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнить еще один запрос если первый пустой?  [new]
acidophilus
Member

Откуда:
Сообщений: 120
qwwq,

спасибо!
5 июн 17, 16:31    [20540912]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить