41

現在、いくつかのフィールドを返すSQLクエリがあります。効果的にサブクエリサブになるには、フィールドの1つが必要です。

問題の詳細:

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

EGの結果は

 (SELECT ModuleValue FROM Table_X WHERE ModuleID=@ModuleID)

値1

値2

値3

..。

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

値1、値2、値3

ユーザーになることができる単純な連結方法はありますか?

編集:

DBはMSTSQL(2005)

4

7 に答える 7

38

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

DECLARE @csv VARCHAR(1000)

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

ModuleValue列がまだ文字列型でない場合は、にキャストする必要がある場合がありますVARCHAR。)

于 2009-08-27T09:18:10.013 に答える
36

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

declare @result varchar(500)
set @result = ''
select @result = @result + ModuleValue + ', ' 
from TableX where ModuleId = @ModuleId
于 2009-08-27T09:01:11.060 に答える
17

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

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

使用している方言がわかりません。

于 2009-08-27T09:01:32.603 に答える
12

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

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

これはあなたが探しているもののようなものをあなたに与えるはずです。

マーク

于 2009-08-27T09:05:21.473 に答える
8

私の意見では、SQL Server 2017以降を使用している場合は、次を使用STRING_AGG( ... )するのが最善の解決策です。

詳細:

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

于 2017-09-08T17:04:08.823 に答える
6

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

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

ただし、Group-concatはすべてのデータベースサーバーで使用できるわけではありません。

于 2009-08-27T09:02:48.920 に答える
4

マークの小さな更新では、最後に追加の「、」があります。スタッフ関数を使用して余分なセミコロンを削除しました。

       SELECT STUFF((  SELECT ',' + ModuleValue AS ModuleValue
                           FROM ModuleValue WHERE ModuleID=@ModuleID
                      FOR XML PATH('') 
                     ), 1, 1, '' )
于 2016-04-26T10:12:31.540 に答える