объединить строки из оператора выбора - PullRequest
1 голос
/ 01 июня 2009

У меня есть оператор выбора, похожий на этот

select col1 from table1 where cond1=true

Это возвращает результаты как

col1
_____
5
5
6
3

но я хочу изменить это, чтобы вернуть меня

5-5-6-3

Возможно ли это? Если так, то как? Пожалуйста, дайте мне знать, как это сделать. Заранее благодарим за ваши ответы.

Ответы [ 8 ]

3 голосов
/ 01 июня 2009

http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html

SELECT my_column AS [text()]
FROM   my_table
FOR XML PATH('')
3 голосов
/ 01 июня 2009

Это именно то, что вы хотите:

declare @ret varchar(500)
set @ret=''
select @ret = @ret + col1 + '-' from test

select substring(@ret, 1, len(@ret)-1)

ПРИМЕЧАНИЕ: если ваш col1 int , то я думаю, вам придется использовать convert или cast , чтобы сделать его varchar .

1 голос
/ 01 июня 2009

Вы, вероятно, могли бы, но почему бы не сделать это в приложении? Я не знаю, какой язык вы используете, но вы можете сделать что-то вроде этого после получения результата запроса (псевдокод):

result = result.join('-')
0 голосов
/ 08 сентября 2009

Под MySQL вы можете сделать это легко

select GROUP_CONCAT(col1 SEPARATOR '-') from table1 where cond1=true
0 голосов
/ 01 июня 2009

попробуйте это:

declare @Test table (rowid int identity(1,1) primary key, col1 int not null)
insert into @test Values (5)
insert into @test Values (5)
insert into @test Values (6)
insert into @test Values (3)


declare @value varchar(500)
set @value=NULL
select @value = COALESCE(@Value+'-'+CONVERT(varchar,col1),convert(varchar,col1)) from @Test

print @value
0 голосов
/ 01 июня 2009

Это также работает:

  --Sample Data
DECLARE @Test TABLE
    (
    Col1 int 
    )

INSERT @Test
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5

--The query
SELECT          SUBSTRING(
                (
                SELECT          '-' + CAST(Col1 AS varchar(10))
                FROM            @Test
                ORDER BY        Col1
                FOR XML PATH    ('')
                ), 2, 2000) AS MyJoinedColumn
0 голосов
/ 01 июня 2009

Я бы посоветовал вам сделать это в начале, для большого количества строк это будет довольно медленно. SQL Server чрезвычайно медленно объединяет ошибки. Вы можете создать функцию .net, которая берет таблицу и возвращает строку, таким образом вы можете обеспечить скорость.

Если нет проблем с производительностью, как, например, один раз и т. Д., Используйте другие решения, описанные выше, так как они обрабатываются в sql

0 голосов
/ 01 июня 2009

Если вы используете Microsoft SQL Server, вы должны сделать это с помощью команды REPLACE.

SELECT col1,
       dynamic_text = REPLACE( 
                ( 
                    SELECT 
                        DISTINCT phone_col2 AS [data()] 
                    FROM 
                        table2
                    WHERE 
                        condition 
                    FOR XML PATH ('') 
                ), '', '-')

 FROM table1
WHERE condition

Нечто подобное, вероятно, сработает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...