[解決済み] Microsoft SQL Server 2005でgroup_concat MySQL関数をシミュレートする?
2022-03-15 21:58:33
質問
MySQLベースのアプリケーションをMicrosoft SQL Server 2005に移行しようとしています(選択したわけではありませんが、それが人生です)。
元のアプリでは
ほとんど
完全に ANSI-SQL 準拠のステートメントですが、ひとつだけ重要な例外があります -- 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だけなので、あまり説明しすぎないようにお願いします :)
どのように解決するのですか?
本当に簡単な方法はありません。しかし、たくさんのアイデアがあります。
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)
関連
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] SQL Server にテーブルが存在するかどうかを確認する
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL - ストアドプロシージャ (データ型、関数)
-
org.postgresql.util.PSQLException: ERROR: リレーション "userinfo" の列 "loginid" が存在しません。
-
SQL-初心者のためのベスト入門SQLクエリ I
-
[解決済み] PostgreSQLのCREATE DATABASE IF NOT EXISTSをシミュレートしてみませんか?
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] SQLiteデータベースで、一度に複数行を挿入することは可能ですか?
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] 既存のカラムにIDを追加する
-
[解決済み] VARCHARとCHARの違いは何ですか?