![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как запросом или процедурой получить 'столбец' в виде строки? [D7, FB 2]
Col2Row © (2009-12-25 22:25:00)Есть таблица, с некоторым полем:
Field1
В таблице 4 записи с 4-мя значениями поля Field1:
Value1
Value2
Value3
Value4
Нужно запросом или процедурой получить такую строчку:
Value1\Value2\Value3\Value4
Кщд (2009-12-28 09:58:00) [1]>Col2Row (27.12.09 23:47) [18]
доку принципиально не читаем?
ibase.ru: substring
а коли уж делаете на psql, то кто мешает не дописывать разделитель после последней строки?
Col2Row (2009-12-27 23:47:00) [2]>ну вы поняли смысл
Смысл я как бы знал :) Вот только как это на sql выразить...
12 (2009-12-27 12:26:00) [3]нет конечно
очень болит голова
ну вы поняли смысл
sniknik (2009-12-27 11:28:00) [4]> if length(s) > 0 then setlength(s,length(s)-1)
FB уже паскаль код поддерживает? круто!
12 (2009-12-27 11:23:00) [5]if length(s) > 0 then setlength(s,length(s)-1)
Col2Row (2009-12-26 16:01:00) [6]Как бы еще последнюю '\' убрать :) Попробовал в основном запросе - работает почти идеально :) Только в конце оставляет лишнее '\'.
Col2Row (2009-12-26 15:51:00) [7]Поменял переменные на VARCHAR. Trim не нужен.
Col2Row (2009-12-26 15:49:00) [8]>Ну добавь "бла-бла". Вернет нужное с "бла-бла"?
Всё дало :) Сам додумался: TEMP = Trim(TEMP). Всем спасибо.
Sergey13 (2009-12-26 14:17:00) [9]> [9] Col2Row (26.12.09 13:10)
> Добавил TEMP = "
Ну добавь "бла-бла". Вернет нужное с "бла-бла"?
Col2Row (2009-12-26 13:11:00) [10]Сорри, на TEMP = TEMP || :DIVIDER, кусок кода пролез :)
Col2Row (2009-12-26 13:10:00) [11]Спасибо, уже немного продвинулись :)
Добавил TEMP = ""; пишет - numeric overflow or string iruncaction.
Пишет даже на "TEMP = TEMP || :MODALITY_DIVIDER". То есть - не может сложить две переменные.
Sergey13 (2009-12-26 12:56:00) [12]> [7] Col2Row (26.12.09 12:49)
ну так TEMP то надо инициализировать чем то окромя NULL-а, прежде чем прибавлять к нему что то.
Col2Row (2009-12-26 12:49:00) [13]Возвращается почему-то null, псевдокод:
create or alter procedure ()
returns (
RESULT char(50))
as
declare variable DIVIDER char(1);
declare variable VALUES char(2);
declare variable TEMP char(50);
begin
DIVIDER = "\";
for select VALUE
from TABLE
into :VALUES
do
TEMP = TEMP || :DIVIDER || :VALUES;
RESULT = TEMP;
suspend;
end
Если написать так: "TEMP = :DIVIDER || :VALUES;", то возвращается разделитель + одно значение. Если suspend перенести в блок do - то возвращается столбец - разделитель + все значения поля. То есть - не работает TEMP = TEMP. Что-то я делаю не так, что - не знаю, а пример найти не могу.
Sergey13 (2009-12-26 12:00:00) [14]> [5] Col2Row (26.12.09 11:35)
Ну так в цикле в процедуре читай да склеивай.
Col2Row (2009-12-26 11:35:00) [15]>А почему не в клиенте? ИМХО самое простое.
Результат на сервере нужен. Это - подзапрос.
>LIST - стандартная для 2 функция
Посмотрел. Слишком специфичная функция - только FB 2.1 и выше. У нас много FB 2.0.4.
Виталий Панасенко(дом) (2009-12-26 10:13:00) [16]LIST - стандартная для 2 функция
Sergey13 (2009-12-26 08:16:00) [17]> Как запросом или процедурой
А почему не в клиенте? ИМХО самое простое.
Col2Row (2009-12-25 23:34:00) [18]Спасибо. Для Firebird'а бы...
12 (2009-12-25 23:25:00) [19]mssql 2000
select top 10 product from product
declare @p varchar(255)
set @p=''
select top 10 @p=@p+convert(varchar(10),product)+';' from product
select @p