2009-08-31 30 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,