powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Очередной запрос. Кейсы
9 сообщений из 9, страница 1 из 1
Очередной запрос. Кейсы
    #38801263
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго вечера!

Столкнулся с такой вот штукой:
Код: plsql
1.
2.
3.
4.
SELECT
    case when(1=1)
        then (select count(*)=0 from t1 where id<10)
    end;



Которая выводит, например, "true".
Куда нужно впихнуть 'A' так, чтобы оно вывело "true, 'A'" ?
...
Рейтинг: 0 / 0
Очередной запрос. Кейсы
    #38801283
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanillaNInja,

SELECT
case when(1=1)
then (select count(*)=0 from t1 where id<10)
end,
'A';

например
...
Рейтинг: 0 / 0
Очередной запрос. Кейсы
    #38801661
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, неверно сформулировал пример. Хочется выводить эту самую "А" внутри кейса. Просто понять не могу почему, но когда пытаюсь

Код: plsql
1.
2.
3.
4.
SELECT
    case when(1=1)
        then (select count(*)=0 from t1 where id<10), 'A'
    end;



Не получается. Если же после условия 'where'- то такая афера тоже не сработает, так как там должен быть только один столбец.
...
Рейтинг: 0 / 0
Очередной запрос. Кейсы
    #38801741
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanillaNInjaДа, неверно сформулировал пример. Хочется выводить эту самую "А" внутри кейса. Просто понять не могу почему, но когда пытаюсь

Код: plsql
1.
2.
3.
4.
SELECT
    case when(1=1)
        then (select count(*)=0 from t1 where id<10), 'A'
    end;



Не получается. Если же после условия 'where'- то такая афера тоже не сработает, так как там должен быть только один столбец.


никак штатными методами, нельзя из выражения 2 колонки вернуть.
можно 2 case написать просто


PS: в теории должна работать конструкция вида
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT
(
case when(1=1)
then (select t from (select false as field1, 'A' as field2) as t)
end
).*;


но не работает
что еще более странно при этом row_to_json в такой же формулировке работает:
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT
row_to_json (
case when(1=1)
then (select t from (select false as field1, 'A' as field2) as t)
end
);

row_to_json
-------------------------------
{"field1":false,"field2":"A"}
...
Рейтинг: 0 / 0
Очередной запрос. Кейсы
    #38801784
VanillaNInja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ого, вот это неожиданный поворот для меня. А бился над этим куском достаточно продолжительное время. :-(
Спасибо огромное за помощь :-)
...
Рейтинг: 0 / 0
Очередной запрос. Кейсы
    #38802378
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukPS: в теории должна работать конструкция вида
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT
(
case when(1=1)
then (select t from (select false as field1, 'A' as field2) as t)
end
).*;


но не работает

Максим, а почему не так:
Код: sql
1.
2.
3.
4.
SELECT
case when(1=1)
then (select t from (select false as field1, 'A' as field2) as t)
end;



как я понимаю, select ().* требует явного объявления составного типа
...
Рейтинг: 0 / 0
Очередной запрос. Кейсы
    #38802834
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ЛузановMaxim BogukPS: в теории должна работать конструкция вида
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT
(
case when(1=1)
then (select t from (select false as field1, 'A' as field2) as t)
end
).*;


но не работает

Максим, а почему не так:
Код: sql
1.
2.
3.
4.
SELECT
case when(1=1)
then (select t from (select false as field1, 'A' as field2) as t)
end;



как я понимаю, select ().* требует явного объявления составного типа

потому что просили вернуть 2 колонки а не ROW(false,'A')
не всегда явное обьявление составного типа надо... например работают:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select (t).* from (select 1 as val1, 2 as val2) as t;
 val1 | val2
------+------
    1 |    2

и даже работает

select (t_row).* from (select t as t_row from (select 1 as val1, 2 as val2) as t offset 0) as _something;
 val1 | val2
------+------
    1 |    2

а вот при пропускании этого всего через CASE - оно теряется:

select (t_row).* from (select case when true then t else null end as t_row from (select 1 as val1, 2 as val2) as t offset 0) as _something;
ERROR:  record type has not been registered



т.е. никакой никакой разумной системы понять когда информация о именах и типах колонок останется в ROW() а когда нет.
Возможно вот правки сделанные по вот этому репорту:
http://www.postgresql.org/message-id/flat/545CF0AC.9040809@dunslane.net]http://www.postgresql.org/message-id/flat/545CF0AC.9040809@dunslane.net
ситуацию исправят в 9.4.

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Очередной запрос. Кейсы
    #38802881
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Спасибо за разъяснения!
...
Рейтинг: 0 / 0
Очередной запрос. Кейсы
    #38802931
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

в случае с кейсами эта конструкция похоже принудительно кастуется в record, а не row, поэтому разворачивание и не работает. Что, наверное, и правильно т.к. кейс в общем случае для разных строк может выдать разные типы строк.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Очередной запрос. Кейсы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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