2009-08-31 98 views
1

我有一个SQL表称为UsersInAuthentication列进行自定义格式

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

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

编辑: 我使用SQL Server 2005

+0

您正在使用哪种RDBMS? – Eric 2009-08-31 11:20:22

+0

我正在使用MSSQL服务器 – Myra 2009-08-31 11:37:32

+0

你如何设想更新工作? – pjp 2009-08-31 11:49:04

回答

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; 
4

击败表的目的了一下。同时更新这个可以并且会变得棘手。

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

+0

想知道您对Myra的用法做出了假设。 *有*可行的理由来做到这一点,特别是如果你将列表传递给代码或试图创建某种类型的CSV。我还处理了一些需要特定格式数据的有趣遗留系统。 – Eric 2009-08-31 11:51:25

+0

如果您无法执行预处理/后处理,或者改变遗留系统解释数据的方式,请确保您完全正确。但不太可能... – 2009-08-31 11:57:14

+0

你能举一个设计的例子吗? – Myra 2009-08-31 12:58:29

-1
SELECT CONCAT('(', GROUP_CONCAT(UserId SEPARATOR ','), ')') 
FROM UsersInAuthentication; 
+0

这只适用于MySQL。 – Eric 2009-08-31 11:19:49

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); 

但请注意,在数据库中使用逗号分隔的值在某种程度上忽略了重点。

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,