列以自定义格式排成行

时间:2009-08-31 11:10:49

标签: sql sql-server sql-server-2005 stored-procedures

我有一个名为 UsersInAuthentication 的SQL表,如

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

我希望将所有格式为“(4,5,8)”的用户作为带有单个存储过程的字符串和 如果可能的话,我也希望以这种格式插入,更新,删除操作。

修改 我正在使用SQL Server 2005

5 个答案:

答案 0 :(得分:4)

稍微胜过桌子的目的。同样更新这一点可能会变得棘手。

好像你应该重新考虑你的桌子的设计,要么重新考虑你要使用它的方式。

答案 1 :(得分:3)

由于您使用的是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 :(得分:2)

假设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,

答案 3 :(得分:0)

实际查询实际上取决于您的DBMS。假设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);

但请注意,在数据库中使用逗号分隔的值会以某种方式忽略这一点。

答案 4 :(得分:-1)

SELECT CONCAT('(', GROUP_CONCAT(UserId SEPARATOR ','), ')')
FROM UsersInAuthentication;