none
sql объединение строк типа varchar RRS feed

  • Вопрос

  • Добрый день!

    Подскажите, можно ли средствами sql объединить первые 3 строки? Нужно объединить 'UserLogin'.

    Чтобы в ячейке было: 'izanegin_akorovin_vpupkin'.

    Не хочется эту задачу обрабатывать в C#. 

    14 апреля 2015 г. 12:15

Ответы

  • Вот так можно:

    create table #table (UserLogin varchar(max), GUID uniqueidentifier)
    
    print newid()
    
    insert #table values ('a', 'ABC8896B-29F1-44D2-AB19-698B27CE6593')
    insert #table values ('b', '4B6BF634-5A65-48C6-A171-633C535CABCB')
    insert #table values ('c', 'ABC8896B-29F1-44D2-AB19-698B27CE6593')
    insert #table values ('d', '4B6BF634-5A65-48C6-A171-633C535CABCB')
    insert #table values ('e', 'ABC8896B-29F1-44D2-AB19-698B27CE6593')
    insert #table values ('f', 'D3012FD3-7060-4811-BB62-454ECC1A8D07')
    
    declare @result varchar(max)
    
    select 
    	distinct
    	GUID, (select top 3 UserLogin + '_'
    		from #table 
    		where GUID = t.GUID
    		for xml path(''))
    from
    	#table t
    
    print @result
    
    drop table #table

    • Помечено в качестве ответа ilya83 15 апреля 2015 г. 7:08
    15 апреля 2015 г. 6:30
    Отвечающий

Все ответы

  • Добрый день.

    Да, напишите курсор.

    14 апреля 2015 г. 13:37
    Отвечающий
  • понял, попробую поискать
    14 апреля 2015 г. 13:49
  • Я не совсем понял. Нужно получить из БД одно скалярное значение в виде объединённых первых трёх строк колонки UserLogin?

    Остальные строки просто отсеять? А с колонкой гуидов что делать?

    14 апреля 2015 г. 14:01
  • В принципе вот так можно:


    14 апреля 2015 г. 14:15
    Отвечающий
  • С данными из примера Алексея я набросал следующее:

    declare @result varchar(max)
    
    with Logins_CTE (UserLogin) as
    (
        select top 3 UserLogin
        from #table
    )
    
    select @result = Coalesce(@result + '_', '') + UserLogin
    from Logins_CTE
    
    select @result

    14 апреля 2015 г. 14:43
  • Есть ещё вариант с написанием кастомной агрегатной функции. Вариант самый универсальный, но требующий немного программирования на C#.
    14 апреля 2015 г. 19:45
  • Я извиняюсь, если не корректно сформулировал вопрос.

    Я хочу полученную таблицу сгруппировать по повторяющимся GUID-ам. Т.е. первые три строки заменяются на одну вида:

    UserLogin='izanegin_akorovin_vpupkin'

    и

    Guid='496463b8-953e-47d7-aa4c-24e052e9901a'

    Остальные строки, если имеют уникальные Guid остаются без изменений. Таблица может быть значительно размера, так что привязываться к 'TOP 3' нельзя.

    Я думаю надо сделать это как-то через цикл, хотя говорят циклы в sql работаю медленно.

    15 апреля 2015 г. 6:18
  • Вот так можно:

    create table #table (UserLogin varchar(max), GUID uniqueidentifier)
    
    print newid()
    
    insert #table values ('a', 'ABC8896B-29F1-44D2-AB19-698B27CE6593')
    insert #table values ('b', '4B6BF634-5A65-48C6-A171-633C535CABCB')
    insert #table values ('c', 'ABC8896B-29F1-44D2-AB19-698B27CE6593')
    insert #table values ('d', '4B6BF634-5A65-48C6-A171-633C535CABCB')
    insert #table values ('e', 'ABC8896B-29F1-44D2-AB19-698B27CE6593')
    insert #table values ('f', 'D3012FD3-7060-4811-BB62-454ECC1A8D07')
    
    declare @result varchar(max)
    
    select 
    	distinct
    	GUID, (select top 3 UserLogin + '_'
    		from #table 
    		where GUID = t.GUID
    		for xml path(''))
    from
    	#table t
    
    print @result
    
    drop table #table

    • Помечено в качестве ответа ilya83 15 апреля 2015 г. 7:08
    15 апреля 2015 г. 6:30
    Отвечающий
  • Спасибо всем за ответы.

    Алексей, последний вариант, то, что мне нужно. Спасибо.

    Если не сложно объясните эту фразу 
    for xml path('')
    • Изменено ilya83 15 апреля 2015 г. 7:19
    15 апреля 2015 г. 7:09
  • Пожалуйста. Четче формулируйте вопросы, тогда и помогут быстрее ;)
    15 апреля 2015 г. 7:13
    Отвечающий