Microsoft SQL Server 2005 で group_concat MySQL 関数をシミュレートしますか? 質問する

Microsoft SQL Server 2005 で group_concat MySQL 関数をシミュレートしますか? 質問する

私は、MySQL ベースのアプリケーションを Microsoft SQL Server 2005 に移行しようとしています (選択ではありませんが、それが人生です)。

元のアプリでは、ほぼ完全に ANSI-SQL 準拠のステートメントを使用しましたが、1 つの大きな例外がありました。それは、MySQL のgroup_concat関数をかなり頻繁に使用していたことです。

group_concatちなみに、 は、従業員の名前とプロジェクトのテーブルが与えられた場合、次のように動作します。

SELECT empName, projID FROM project_members;

戻り値:

ANDY   |  A100
ANDY   |  B391
ANDY   |  X010
TOM    |  A100
TOM    |  A510

...group_concat を使用すると次のようになります:

SELECT 
    empName, group_concat(projID SEPARATOR ' / ') 
FROM 
    project_members 
GROUP BY 
    empName;

戻り値:

ANDY   |  A100 / B391 / X010
TOM    |  A100 / A510

そこで私が知りたいのは、たとえば、 の機能をエミュレートするユーザー定義関数を SQL Server で記述できるかどうかですgroup_concat

私は UDF やストアド プロシージャなどを使用した経験がほとんどなく、SQL のみを使用しているため、説明が長くなる可能性があります :)

ベストアンサー1

これを行う本当に簡単な方法はありません。ただし、アイデアはたくさんあります。

私が見つけた最高のもの:

SELECT table_name, LEFT(column_names , LEN(column_names )-1) AS column_names
FROM information_schema.columns AS extern
CROSS APPLY
(
    SELECT column_name + ','
    FROM information_schema.columns AS intern
    WHERE extern.table_name = intern.table_name
    FOR XML PATH('')
) pre_trimmed (column_names)
GROUP BY table_name, column_names;

または、データに次のような文字が含まれている場合でも正しく動作するバージョン<

WITH extern
     AS (SELECT DISTINCT table_name
         FROM   INFORMATION_SCHEMA.COLUMNS)
SELECT table_name,
       LEFT(y.column_names, LEN(y.column_names) - 1) AS column_names
FROM   extern
       CROSS APPLY (SELECT column_name + ','
                    FROM   INFORMATION_SCHEMA.COLUMNS AS intern
                    WHERE  extern.table_name = intern.table_name
                    FOR XML PATH(''), TYPE) x (column_names)
       CROSS APPLY (SELECT x.column_names.value('.', 'NVARCHAR(MAX)')) y(column_names) 

おすすめ記事