概要
Excelで「SQL文を手でポチポチ書く」のは正直しんどいですよね。
- IN句用の
'A','B','C'をリストから自動生成したい - カラム名のカンマ区切り
col1, col2, col3をシートから作りたい - INSERT文の
(値1, 値2, 値3)の並びを行データから作りたい
こういうときにめちゃくちゃ使えるのが TEXTJOIN 関数です。
TEXTJOIN は
「区切り文字を指定して、複数セルの文字列をまとめて結合する」関数です。
SQLは「カンマ区切り」「クォート付き」「AND区切り」などのパターンの塊なので、
TEXTJOINと少しの工夫だけで、SQL文の大量生成がグッと楽になります。
ここでは、プログラミング初心者でもわかるように、
SQL文生成に特化したTEXTJOINの使い方を、テンプレートと例題で丁寧に解説します。
TEXTJOINの基本
基本構文
=TEXTJOIN(区切り文字, 空白セル無視, 結合したい範囲や文字列...)
例えば、A2:A4 に
A2:A
A3:B
A4:C
が入っているとして、
=TEXTJOIN(",", TRUE, A2:A4)
と書くと結果は
A,B,C
になります。
SQL生成では、この「区切り文字」の部分に
","(カンマ)" AND "(スペース入りAND)"," & CHAR(10)(カンマ+改行) など
を使っていきます。
パターン1:IN句用の値リストを生成する
基本形:’A’,’B’,’C’ のようなリストを作る
A2:A4 に
A2:A
A3:B
A4:C
が入っているとして、
IN ('A','B','C')
の中身部分 'A','B','C' をExcelで生成したいとします。
この場合、1つ1つの値を「クォート付き文字列」にしておき、
それらをTEXTJOINでカンマ区切りにします。
B2に次の式を入れて下までコピー(A2を参照):
="'" & A2 & "'"
すると、B2:B4は
B2:’A’
B3:’B’
B4:’C’
になります。
あとは、どこかのセルに
=TEXTJOIN(",", TRUE, B2:B4)
と書けば、結果は
'A','B','C'
SQLとしては、
SELECT *
FROM テーブル名
WHERE カラム名 IN ('A','B','C');
の中身部分がExcelで簡単に作れます。
パターン2:カラム名一覧をカンマ区切りで生成する
SELECT句・INSERT句のカラムリストを作る
A2:A5 にカラム名が入っているとします。
A2:id
A3:name
A4:email
A5:created_at
これを
id, name, email, created_at
のような形で出したい場合、次のようにします。
=TEXTJOIN(", ", TRUE, A2:A5)
結果:
id, name, email, created_at
これをSELECT文やINSERT文のカラム部分に貼り付ければOKです。
パターン3:WHERE句の条件をANDでつなぐ
条件を行で管理して、AND区切りのWHERE句を作る
A2:A4 に条件文字列を入れておきます。
A2:status = ‘ACTIVE’
A3:deleted = 0
A4:type = ‘USER’
これらを
status = 'ACTIVE' AND deleted = 0 AND type = 'USER'
のようにつなぎたい場合、次のようにします。
=TEXTJOIN(" AND ", TRUE, A2:A4)
結果:
status = 'ACTIVE' AND deleted = 0 AND type = 'USER'
あとは、
SELECT *
FROM users
WHERE status = 'ACTIVE' AND deleted = 0 AND type = 'USER';
のWHERE部分として使えます。
条件を追加したいときは、A列に1行足してあげるだけで、式の範囲を広げればOKです。
パターン4:INSERT文のVALUES部分を生成する
1行分のVALUESを作る
A2:D2 に
A2:1
B2:’Yamada’
C2:’yamada@example.com’
D2:’2026-01-06′
のような内容を想定します(実際にはセルには数値や日付が入っていてOK)。
まず、1つ1つの値を「SQL用の表記」に整えます。
簡単のため、すべて「文字列としてシングルクォートで囲む」例を見ます。
E2に次の式を入れて右へコピー(A2を参照):
="'" & A2 & "'"
同様にB2,C2,D2にもコピーされて、
E2:’1′
F2:’Yamada’
G2:’yamada@example.com’
H2:’2026-01-06′
となります。
このE2:H2をカンマ区切りでつなぎます。
=TEXTJOIN(", ", TRUE, E2:H2)
結果:
'1', 'Yamada', 'yamada@example.com', '2026-01-06'
これをINSERT文に組み込むと、
INSERT INTO users (id, name, email, created_at)
VALUES ('1', 'Yamada', 'yamada@example.com', '2026-01-06');
が作れます。
実務では、数値はクォート無し、文字列だけクォートあり、などもう少し条件分けが必要ですが、
「SQL用に整形したセル群をTEXTJOINでつなぐ」という発想が基本になります。
パターン5:複数行のVALUESを一気に生成するイメージ
TEXTJOIN自体は「1つの行(または1つの範囲)」に対して使うことが多いですが、
「行ごとに1個のINSERT文(またはVALUES行)」を作る、という使い方も定番です。
例:
- 各行に1件分のデータ(id, name, email…)を入力
- 各行の末尾のセルに、
TEXTJOINを使って(値1, 値2, 値3, …)の形の文字列を生成 - その列だけをコピーして、SQLエディタに貼り付ける
1行分のVALUES部分を作るテンプレート例:
="(" & TEXTJOIN(", ", TRUE, E2:H2) & "),"
結果:
('1', 'Yamada', 'yamada@example.com', '2026-01-06'),
これを複数行分作って並べれば、複数VALUESのINSERT文を一気に作ることができます。
SQL文生成用TEXTJOINテンプレートまとめ
SQLのIN句用値リスト
=TEXTJOIN(",", TRUE, B2:B10) ' B列に 'A' 形式を作っておく
SELECT/INSERTのカラムリスト
=TEXTJOIN(", ", TRUE, A2:A20)
AND区切りのWHERE条件
=TEXTJOIN(" AND ", TRUE, A2:A20)
1行分VALUESの中身
=TEXTJOIN(", ", TRUE, E2:H2)
括弧付きVALUES行
="(" & TEXTJOIN(", ", TRUE, E2:H2) & "),"
例題
問題1
A2:A4 に
A2:A
A3:B
A4:C
が入っています。
これらをカンマ区切りのA,B,C
という1つの文字列にしたいです。TEXTJOINを使った式を書いてください。
=TEXTJOIN(",", TRUE, A2:A4)
問題2
B2:B4 に
B2:’A’
B3:’B’
B4:’C’
が入っています。
これらを'A','B','C'
という文字列にしたいです。TEXTJOINを使った式を書いてください。
=TEXTJOIN(",", TRUE, B2:B4)
問題3
A2:A5 に
A2:id
A3:name
A4:email
A5:created_at
が入っています。
これらをid, name, email, created_at
というカンマ区切りのカラムリストにしたいです。TEXTJOINを使った式を書いてください。
=TEXTJOIN(", ", TRUE, A2:A5)
問題4
A2:A4 に
A2:status = ‘ACTIVE’
A3:deleted = 0
A4:type = ‘USER’
が入っています。
これらをstatus = 'ACTIVE' AND deleted = 0 AND type = 'USER'
というWHERE句用の文字列にしたいです。TEXTJOINを使った式を書いてください。
=TEXTJOIN(" AND ", TRUE, A2:A4)
問題5
E2:H2 に
E2:’1′
F2:’Yamada’
G2:’yamada@example.com’
H2:’2026-01-06′
が入っています。
これらを('1', 'Yamada', 'yamada@example.com', '2026-01-06'),
というVALUES行の1行分にしたいです。TEXTJOINを使った式を書いてください。
="(" & TEXTJOIN(", ", TRUE, E2:H2) & "),"
TEXTJOINは、
「セルにバラバラに並んだパーツを、SQLの形にまとめ直すための“糊(のり)”」だと思ってください。
区切り文字をどうするかさえ決めてしまえば、SQL文の大量生成が一気に現実的になります。
