発行SELECT username FROM Users
すると、次の結果が得られます。
ユーザー名 -------- ポール ジョン メアリー
しかし、私が本当に必要としているのは、次のように、すべての値がコンマで区切られた1つの行です。
ポール、ジョン、メアリー
どうすればよいですか?
select
distinct
stuff((
select ',' + u.username
from users u
where u.username = username
order by u.username
for xml path('')
),1,1,'') as userlist
from users
group by username
以前にタイプミスがあった、上記の作品
これはあなたのために働くはずです。SQL2000までさかのぼってテストしました。
create table #user (username varchar(25))
insert into #user (username) values ('Paul')
insert into #user (username) values ('John')
insert into #user (username) values ('Mary')
declare @tmp varchar(250)
SET @tmp = ''
select @tmp = @tmp + username + ', ' from #user
select SUBSTRING(@tmp, 0, LEN(@tmp))
いくつかのアプローチの良いレビュー:
記事のコピー-
CoalesceはT-SQLの文字列連結に対する答えではありませんCOALESCE関数を使用してT-SQLで文字列連結を機能させることについて、長年にわたって多くの投稿を見てきました。これはここでの例の1つです(Readifarian Marc Rideyから借用)。
DECLARE @categories varchar(200)
SET @categories = NULL
SELECT @categories = COALESCE(@categories + ',','') + Name
FROM Production.ProductCategory
SELECT @categories
このクエリは非常に効果的ですが、注意が必要であり、COALESCEの使用法を正しく理解する必要があります。COALESCEは、3つ以上のパラメーターを取ることができるISNULLのバージョンです。nullではないパラメータのリストの最初のものを返します。したがって、実際には連結とは何の関係もありません。次のコードは、COALESCEを使用せずにまったく同じです。
DECLARE @categories varchar(200)
SET @categories = ''
SELECT @categories = @categories + ',' + Name
FROM Production.ProductCategory
SELECT @categories
しかし、データベースの順序付けられていない性質により、これは信頼できません。T-SQLに連結関数が(まだ)ない理由は、これが要素の順序が重要な集合体であるためです。文字列連結のこの変数割り当てメソッドを使用すると、特にサブ文字列を特定の順序で配置する場合は、返される回答にすべての値が含まれていないことが実際にわかる場合があります。次のことを考えてみてください。私のマシンでは、「、Bikes、Clothing、Components、Accessories」を返したいときに「、Accessories」のみが返されます。
DECLARE @categories varchar(200)
SET @categories = NULL
SELECT @categories = COALESCE(@categories + ',','') + Name
FROM Production.ProductCategory
ORDER BY LEN(Name)
SELECT @categories
順序を考慮に入れ、特に文字列の連結を目的としてSQL2005に含まれているメソッドを使用する方がはるかに優れています-FOR XML PATH('')
SELECT ',' + Name
FROM Production.ProductCategory
ORDER BY LEN(Name)
FOR XML PATH('')
最近、サブクエリを使用するときにGROUP BYとDISTINCTを比較した投稿で、FOR XML PATH('')の使用方法を示しました。これを見てみると、サブクエリでどのように機能するかがわかります。'STUFF'関数は、先頭のコンマを削除するためだけにあります。
USE tempdb;
GO
CREATE TABLE t1 (id INT, NAME VARCHAR(MAX));
INSERT t1 values (1,'Jamie');
INSERT t1 values (1,'Joe');
INSERT t1 values (1,'John');
INSERT t1 values (2,'Sai');
INSERT t1 values (2,'Sam');
GO
select
id,
stuff((
select ',' + t.[name]
from t1 t
where t.id = t1.id
order by t.[name]
for xml path('')
),1,1,'') as name_csv
from t1
group by id
;
FOR XML PATHは、サブクエリでORDERBYを使用できる唯一の状況の1つです。もう1つはTOPです。また、名前のない列とFOR XML PATH('')を使用すると、XMLタグのないまっすぐな連結が得られます。これは、文字列がHTMLエンコードされることを意味するため、<文字(など)を含む可能性のある文字列を連結する場合は、後で修正する必要がありますが、いずれにしても、これは文字列を連結するための最良の方法です。 SQLServer2005で。
mwigdahlsの答えに基づいて構築します。ここでグループ化も行う必要がある場合は、次のように表示する方法です。
group, csv
'group1', 'paul, john'
'group2', 'mary'
--drop table #user
create table #user (groupName varchar(25), username varchar(25))
insert into #user (groupname, username) values ('apostles', 'Paul')
insert into #user (groupname, username) values ('apostles', 'John')
insert into #user (groupname, username) values ('family','Mary')
select
g1.groupname
, stuff((
select ', ' + g.username
from #user g
where g.groupName = g1.groupname
order by g.username
for xml path('')
),1,2,'') as name_csv
from #user g1
group by g1.groupname
このクエリを使用して、上記のタスクを実行できます。
DECLARE @test NVARCHAR(max)
SELECT @test = COALESCE(@test + ',', '') + field2 FROM #test
SELECT field2 = @test
詳細とステップバイステップの説明については、次のリンクにアクセスしてください http://oops-solution.blogspot.com/2011/11/sql-server-convert-table-column-data.html
DECLARE @EmployeeList varchar(100)
SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') +
CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1
SELECT @EmployeeList
ソース: http ://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string
SQLiteではこれはもっと簡単です。MySQL、MSSql、Orableにも同様の実装があると思います
CREATE TABLE Beatles (id integer, name string );
INSERT INTO Beatles VALUES (1, "Paul");
INSERT INTO Beatles VALUES (2, "John");
INSERT INTO Beatles VALUES (3, "Ringo");
INSERT INTO Beatles VALUES (4, "George");
SELECT GROUP_CONCAT(name, ',') FROM Beatles;
stuff()を使用して、行をコンマ区切り値として変換できます
select
EmployeeID,
stuff((
SELECT ',' + FPProjectMaster.GroupName
FROM FPProjectInfo AS t INNER JOIN
FPProjectMaster ON t.ProjectID = FPProjectMaster.ProjectID
WHERE (t.EmployeeID = FPProjectInfo.EmployeeID)
And t.STatusID = 1
ORDER BY t.ProjectID
for xml path('')
),1,1,'') as name_csv
from FPProjectInfo
group by EmployeeID;
この回答を得るためのリファレンスを提供してくれた@AlexKuznetsovに感謝します。
PHPを介してこれを実行している場合、これはどうですか?
$hQuery = mysql_query("SELECT * FROM users");
while($hRow = mysql_fetch_array($hQuery)) {
$hOut .= $hRow['username'] . ", ";
}
$hOut = substr($hOut, 0, strlen($hOut) - 1);
echo $hOut;