Столбцы в строке в произвольном формате - PullRequest
1 голос
/ 31 августа 2009

У меня есть таблица sql UsersInAuthentication как

-----------------------
| AuthUserId | UserId |
|    1       |    4   |
|    1       |    5   |
|    1       |    8   |
-----------------------

Я хочу получить всех пользователей в формате "(4,5,8)" в виде строки с одним сохраненным процессом и Если возможно, я также хочу вставить, обновить, удалить операции с этим форматом.

Edit: Я использую SQL Server 2005

Ответы [ 5 ]

4 голосов
/ 31 августа 2009

Немного превосходит цель стола. Также ОБНОВЛЕНИЕ это может и будет сложно.

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

3 голосов
/ 31 августа 2009

Поскольку вы используете SQL Server, вы можете сделать это:

declare @list nvarchar(max)
select @list = ''

select
    @list = @list + 
        case when @list = '' then userid
            else ',' + userid end
from
    UsersInAuthentication  

set @list = '(' + substring(@list, 1, 999) + ')'
print @list

Это хитрый трюк, который строит переменную, добавляя значение каждой строки к текущему значению переменной. Это довольно удобно с табличными операциями и т. П.

Для потомков:

В MySQL вы можете использовать group_concat:

select 
    concat('(' + group_concat(userid order by userid separator ',') + ')') 
from 
    UserInAuthentication

В Oracle вы можете использовать курсор:

cursor c_users is
   select userid from usersinauthentication;
    out_users varchar2(4000);
begin
    for r_user in c_users loop
        if out_users is null then
            out_users:= r_user.first_Name;
        else
            out_users:= out_users ||', '|| r_user.first_Name;
        end if;
    end loop;
return out_users;
2 голосов
/ 31 августа 2009

Предполагается, что SQLServer:

--//testdata
WITH UsersInAuthentication (AuthUserId, UserId) AS (
                SELECT 1, 4
    UNION ALL   SELECT 1, 5
    UNION ALL   SELECT 1, 8
)
--// real query
SELECT  AuthUserId,
    (   SELECT      cast(UserId as varchar) + ','
        FROM        UsersInAuthentication
        ORDER BY    UserID
        FOR XML PATH('')
    ) AS UserIds
FROM    UsersInAuthentication
GROUP BY AuthUserId

чтобы получить:

AuthUserId  UserIds
----------- --------
1           4,5,8,
0 голосов
/ 31 августа 2009

Фактические запросы действительно зависят от вашей СУБД . Предполагая Mysql:

SELECT GROUP_CONCAT(UserId) FROM UsersInAuthentication;
UPDATE UsersInAuthentication SET ... WHERE UserId IN (4,5,8);
DELETE FROM UsersInAuthentication WHERE UserId IN (4,5,8);
INSERT INTO UsersInAuthentication(UserId) VALUES (4), (5), (8);

Но учтите, что работа с разделенными запятыми значениями в базе данных почему-то не подходит

0 голосов
/ 31 августа 2009
SELECT CONCAT('(', GROUP_CONCAT(UserId SEPARATOR ','), ')')
FROM UsersInAuthentication;
...