Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Возврат нескольких колонок в подзапросе / 7 сообщений из 7, страница 1 из 1
13.06.2006, 14:25
    #33787665
Арбайтер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат нескольких колонок в подзапросе
Так работает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
 CASE
  WHEN id= 1  THEN
  (SELECT table2.phone AS phone1 FROM table2)
 ELSE
  table1.phone1
END
 FROM table1

Но я хочу сделать подстановку двух полей в выборке. Т.е.:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
 CASE
  WHEN id= 1  THEN
  (SELECT table2.phone AS phone1, table2.phone AS phone2 FROM table2)
 ELSE
  table1.phone1, table1.phone2 
END
 FROM table1
и получаю ошибку "Подзапрос должен вернуть только одну колонку". Можно это обойти, не используя функции?
...
Рейтинг: 0 / 0
13.06.2006, 14:42
    #33787725
Арбайтер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат нескольких колонок в подзапросе
Я сделал дважды одно и то же.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
 CASE
  WHEN id= 1  THEN
  (SELECT table2.phone AS phone1 FROM table2)
 ELSE
  table1.phone1
END,

CASE
  WHEN id= 1  THEN
  (SELECT table2.phone AS phone2 FROM table2)
 ELSE
  table1.phone2
END

 FROM table1

Но как-то коряво получилось.
...
Рейтинг: 0 / 0
14.06.2006, 06:59
    #33789058
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат нескольких колонок в подзапросе
Конкатенируй в подзапросе два поля в одно через какой-нить хитрый разделитель, а потом оберни весь запрос ещё одним запросом и распарсь конкатенированную строку на две колонки...
...
Рейтинг: 0 / 0
14.06.2006, 07:42
    #33789075
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат нескольких колонок в подзапросе
структуру таблиц посмотреть бы
может так
Код: plaintext
1.
2.
3.
select coalesce(t1.phone1, t2.phone) as phone1, coalesce(t1.phone2, t2.phone) as phone2,
  from table2 t2 
  left join table1 t1 on t1.id = t2.id
...
Рейтинг: 0 / 0
15.06.2006, 10:31
    #33792030
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат нескольких колонок в подзапросе
Код: plaintext
1.
2.
3.
select
 coalesce( table2.phone, table1.phone1 ) as phone1, coalesce( table2.phone, table1.phone2 ) as phone2
from
 table1 left join table2 on table1.id= 1 
Но ваш "корявый" вариант мне нравится больше, он кажется легче читаемым.
...
Рейтинг: 0 / 0
15.06.2006, 15:39
    #33793316
Арбайтер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат нескольких колонок в подзапросе
Спасибо за ответы.

Я сначала объединял оба телефона в одну строку, но потом напоролся на несколько моментов в самом приложении и вернулся обратно.
Эта объединенная строка возвращается как Memo поле. Обычный грид его уже не отображает. Конечно, EhLib отображает, но все равно неудобно.

А вот как распарсить строку - это средствами постгреса, или клиента?
...
Рейтинг: 0 / 0
16.06.2006, 05:36
    #33794385
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат нескольких колонок в подзапросе
АрбайтерСпасибо за ответы.

Я сначала объединял оба телефона в одну строку, но потом напоролся на несколько моментов в самом приложении и вернулся обратно.
Эта объединенная строка возвращается как Memo поле. Обычный грид его уже не отображает. Конечно, EhLib отображает, но все равно неудобно.

А вот как распарсить строку - это средствами постгреса, или клиента?Распарсить за всегда можно средствами PostgreSQL.
Для этого нужно приглядется к функции split_part(string text, delimiter text, field int)

Предположим, что у нас есть строка с разделителем (разделитель - любая комбинация символов, но желательно выбирать разделитель такой, что бы он не совпал с сочетанием символов из самой строки. Я в своем примере использовал вот такое сочетание символов в качестве разделителя: ^$^)

Вот моя строка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 'Postgre'||'^$^'||'SQL' as my_str 
  from dual

Query finished, retrieving results...

   MY_STR      
------------- 
Postgre^$^SQL 

 1  row(s) retrieved

А вот так её можно разделить на части:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select my_str,
       split_part(my_str, '^$^',  1 ) as part_1,
       split_part(my_str, '^$^',  2 ) as part_2
  from (
          select 'Postgre'||'^$^'||'SQL' as my_str 
            from dual
       )

Query finished, retrieving results...

   MY_STR         PART_1    PART_2
-------------    --------   ------
Postgre^$^SQL    Postgre    SQL

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


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