我有一个名为 UsersInAuthentication 的SQL表,如
-----------------------
| AuthUserId | UserId |
| 1 | 4 |
| 1 | 5 |
| 1 | 8 |
-----------------------
我希望将所有格式为“(4,5,8)”的用户作为带有单个存储过程的字符串和 如果可能的话,我也希望以这种格式插入,更新,删除操作。
修改 我正在使用SQL Server 2005
答案 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;