Конференция "Базы" » Как запросом или процедурой получить 'столбец' в виде строки? [D7, FB 2]
 
  • Col2Row (25.12.09 22:25) [0]
    Есть таблица, с некоторым полем:

    Field1

    В таблице 4 записи с 4-мя значениями поля Field1:

    Value1
    Value2
    Value3
    Value4

    Нужно запросом или процедурой получить такую строчку:

    Value1\Value2\Value3\Value4
  • 12 © (25.12.09 23:25) [1]
    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
  • Col2Row (25.12.09 23:34) [2]
    Спасибо. Для Firebird'а бы...
  • Sergey13 © (26.12.09 08:16) [3]
    > Как запросом или процедурой

    А почему не в клиенте? ИМХО самое простое.
  • LIST - стандартная для 2 функция
  • Col2Row (26.12.09 11:35) [5]
    >А почему не в клиенте? ИМХО самое простое.

    Результат на сервере нужен. Это - подзапрос.

    >LIST - стандартная для 2 функция

    Посмотрел. Слишком специфичная функция - только FB 2.1 и выше. У нас много FB 2.0.4.
  • Sergey13 © (26.12.09 12:00) [6]
    > [5] Col2Row   (26.12.09 11:35)

    Ну так в цикле в процедуре читай да склеивай.
  • Col2Row (26.12.09 12:49) [7]
    Возвращается почему-то 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 © (26.12.09 12:56) [8]
    > [7] Col2Row   (26.12.09 12:49)

    ну так TEMP то надо инициализировать чем то окромя NULL-а, прежде чем прибавлять к нему что то.
  • Col2Row (26.12.09 13:10) [9]
    Спасибо, уже немного продвинулись :)

    Добавил TEMP = ""; пишет - numeric overflow or string iruncaction.
    Пишет даже на "TEMP = TEMP || :MODALITY_DIVIDER". То есть - не может сложить две переменные.
  • Col2Row (26.12.09 13:11) [10]
    Сорри, на TEMP = TEMP || :DIVIDER, кусок кода пролез :)
  • Sergey13 © (26.12.09 14:17) [11]
    > [9] Col2Row   (26.12.09 13:10)
    > Добавил TEMP = "

    Ну добавь "бла-бла". Вернет нужное с "бла-бла"?
  • Col2Row (26.12.09 15:49) [12]
    >Ну добавь "бла-бла". Вернет нужное с "бла-бла"?

    Всё дало :) Сам додумался: TEMP = Trim(TEMP). Всем спасибо.
  • Col2Row (26.12.09 15:51) [13]
    Поменял переменные на VARCHAR. Trim не нужен.
  • Col2Row (26.12.09 16:01) [14]
    Как бы еще последнюю '\' убрать :) Попробовал в основном запросе - работает почти идеально :) Только в конце оставляет лишнее '\'.
  • 12 © (27.12.09 11:23) [15]
    if length(s) > 0 then setlength(s,length(s)-1)
  • sniknik © (27.12.09 11:28) [16]
    > if length(s) > 0 then setlength(s,length(s)-1)
    FB уже паскаль код поддерживает? круто!
  • 12 © (27.12.09 12:26) [17]
    нет конечно
    очень болит голова
    ну вы поняли смысл
  • Col2Row (27.12.09 23:47) [18]
    >ну вы поняли смысл

    Смысл я как бы знал :) Вот только как это на sql выразить...
  • Кщд (28.12.09 09:58) [19]
    >Col2Row   (27.12.09 23:47) [18]
    доку принципиально не читаем?
    ibase.ru: substring
    а коли уж делаете на psql, то кто мешает не дописывать разделитель после последней строки?
 
Конференция "Базы" » Как запросом или процедурой получить 'столбец' в виде строки? [D7, FB 2]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]