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() の組み合わせで同様の処理が可能です。

Bubbleによるシステム構築のご相談をいただけます

カテゴリー: Bubble