web-dev-qa-db-ja.com

SQL、結果を連結するには?

現在、いくつかのフィールドを返すSQLクエリがあります。事実上、サブクエリサブであるためには、フィールドが必要です。

問題の詳細:

ModuleIDとModuleValueという2つの列を持つテーブルXがある場合、結果を取得して1つのフィールドに連結するSQLクエリを作成するにはどうすればよいですか。

[〜#〜] eg [〜#〜]から返された結果

 (SELECT ModuleValue FROM Table_X WHERE ModuleID=@ModuleID)

値1

値2

値3

...

したがって、結果を返す必要があります(上記とは異なり、単一の行として):

値1、値2、値3

ユーザーになる可能性のある単純な連結方法はありますか?

編集:

DBはMS TSQL(2005)です

30
Darknight

MSSQLを使用すると、次のようなことができます。

declare @result varchar(500)
set @result = ''
select @result = @result + ModuleValue + ', ' 
from TableX where ModuleId = @ModuleId
33
Blorgbeard

これは、他のほとんどの回答とは異なり、末尾のコンマを自動的に除外します。

DECLARE @csv VARCHAR(1000)

SELECT @csv = COALESCE(@csv + ',', '') + ModuleValue
FROM Table_X
WHERE ModuleID = @ModuleID

ModuleValue列がまだ文字列型でない場合は、VARCHARにキャストする必要があるかもしれません)

35
LukeH

Mysqlでは、次の関数を使用します。

SELECT GROUP_CONCAT(ModuleValue, ",") FROM Table_X WHERE ModuleID=@ModuleID

どの方言を使用しているかわかりません。

11

SQL Server 2005以降では、次のようなことができます。

SELECT 
    (SELECT ModuleValue + ','
     FROM dbo.Modules
     FOR XML PATH('')
    ) 
FROM dbo.Modules
WHERE ModuleID = 1

これにより、探しているもののようなものが得られます。

マーク

9
marc_s

私の意見では、STRING_AGG( ... )を使用することが最良の解決策です。

詳細:

https://stackoverflow.com/a/42778050/1260488

4
sdsc81

使用しているデータベースによって異なります。たとえば、MySQLは(非標準) group_concat 関数をサポートしています。だからあなたは書くことができます:

SELECT GROUP_CONCAT(ModuleValue) FROM Table_X WHERE ModuleID=@ModuleID

ただし、すべてのデータベースサーバーでグループ連結は使用できません。

3
idrosid

Marcの小さなアップデートで、最後に「」が追加されます。私はスタッフ関数を使用して余分なセミコロンを削除しました。

       SELECT STUFF((  SELECT ',' + ModuleValue AS ModuleValue
                           FROM ModuleValue WHERE ModuleID=@ModuleID
                      FOR XML PATH('') 
                     ), 1, 1, '' )
2
sandeep rawat