Bubbleで複雑なシステムを構築する機会が増えたのでメモです。
Bubbleの「SQL Database Connector」は便利なプラグインですが、いくつか制限があります。その中でもよくつまずくのが「パラメータにSELECT文(副問い合わせ)を使えない」という点です。この記事では、その制約を回避して同等の結果を得る方法を紹介します。
なぜ副問い合わせが使えないのか
BubbleのSQL Database Connectorは、安全性と構文検証のため、
クエリ中の「?」パラメータ部分にサブクエリ(SELECT ...)を埋め込むことを禁止しています。
例えば、次のようなクエリはエラーになります:
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE total > ?);
Bubble側で「Parameter cannot contain a SELECT statement」といったエラーが出ることがあります。
回避策:FIND_IN_SETを使う
1. サブクエリの結果を文字列化する
副問い合わせで取得したいIDのリストを、別のSELECT文などで取得し、カンマ区切り文字列に変換してパラメータとして渡します。
例:サブクエリの結果をFormat content as textで「,」区切りにします

2. FIND_IN_SETで判定する
SQL側では、次のようにFIND_IN_SET()を使うことで、
サブクエリの代わりに文字列内検索を行えます。
SELECT *
FROM users
WHERE FIND_IN_SET(id, ?);
Bubbleでは?の部分をパラメータとして設定します。
つまり、?には "1,3,5,7" のような文字列を渡します。
応用例:JOINが使えないケースでも有効
JOINや副問い合わせを避けたい場合にも、この手法は有効です。
たとえば、「特定のグループに所属するユーザーを取得したい」場合:
SELECT *
FROM users
WHERE FIND_IN_SET(group_id, ?);
これにより、? に "2,4,8" などを渡せば、
グループIDが2・4・8のいずれかに一致するユーザーを取得できます。
注意点
- FIND_IN_SETは文字列検索のため、リストが大きすぎるとパフォーマンスが落ちます。
数十~数百件程度までが現実的な範囲です。 - データ型は文字列扱いになるため、数値でも引用符を付けなくても動作しますが、
SQL側の型に注意が必要です。
まとめ
| 課題 | 対処法 |
|---|---|
| SQLDatabaseConnectorで副問い合わせが使えない | FIND_IN_SETを使う |
| IN句にサブクエリを渡せない | カンマ区切り文字列をパラメータにする |
| JOINを避けたい | FIND_IN_SETで代用可能 |
BubbleでSQLを活用する際は、
「FIND_IN_SETをうまく使えば、意外と複雑なクエリも書ける」
ということを覚えておくと便利です。
補足:
FIND_IN_SETはMySQL・MariaDB限定の関数ですが、BubbleのSQL Database Connectorが
接続するデータベースの多くはこれに対応しています。
PostgreSQLなどの場合は string_to_array() と ANY() の組み合わせで同様の処理が可能です。

Call to Action