DynamoDB — The expression can not be empty

TL;DR — 式パラメータ(FilterExpressionKeyConditionExpressionProjectionExpressionUpdateExpression、または ConditionExpression)を 空文字列 "" として渡しました。DynamoDB は、式パラメータが有効な空でない式であるか、完全に不在 であることを要求します。空文字列は無効です。実際に式があるときのみパラメータを含め、そうでなければキーを省略してください。

意味

ValidationException: Invalid FilterExpression: The expression can not be empty;
ValidationException: Invalid KeyConditionExpression: The expression can not be empty;

DynamoDB は空文字列を省略されたパラメータとは別に扱います。FilterExpression を省略するのは「フィルターなし」を意味します。FilterExpression: "" を渡すのは「ここにフィルターがある」を意味します。そして解析するものが何もないため、検証が失敗します。同じことがすべての式パラメータに当てはまります。

発生する理由

  • 条件付きで組み立てられるパラメータが常に設定される — コードが常に FilterExpression をリクエストオブジェクトに付け、フィルターが選ばれなかったとき "" のままにする。
  • フィルターリストが空のときにキーを落とすのではなく 空の式文字列を出力するヘルパー/ORM/コネクタ
  • 何も生まなかった文字列連結 — 空の条件配列を結合すると "" になる。
  • 削られたコンテンツ — プレースホルダーが取り除かれ、空の式が残った。

修正方法

  1. 空でないときのみパラメータを設定します。 params オブジェクトを条件付きで組み立てます: if (filter) params.FilterExpression = filter; — 決して "" を代入しないでください。
  2. 呼び出し前に空のキーを削除します — 値が空/空白の文字列である式プロパティをリクエストから取り除きます。
  3. ビルダーをガードします — 条件のリストが空なら、式をまったく付けないでください。
  4. それらが独立していることを忘れないでください — それらを使う式がないとき、ExpressionAttributeNames/Values も省略します(何にも参照されない {} ではなく)。
  5. テーブル全体の読み取りにはFilterExpression なしの Scan が正しいです。空のものを渡すのではなく、パラメータを省略します。

コードに組み込む前にクエリをプロトタイプしていますか?DynoTable デスクトップアプリ で実行しましょう。実際に入力した式パラメータのみを送るため、空文字列のフィルターを出荷することはありません。

DynoTable で実行する

DynoTable が送るのは、実際に設定した式パラメータだけです — フィルターのリストが空なら、"" を渡すのではなく FilterExpression そのものを省きます。⌘K でテーブルを開き、クエリパネルでフィルターを追加し、条件が 1 つ以上ある状態で生成されたリクエストをコピーしてください。

コードで条件付きのパラメータを組む前に、クエリビルダーで読み取りを試作しましょう。更新での空の式のミスは、ステージング(⌘S)が捕まえてくれます。プロファイルの切り替えは ⌘P、Settings → Profiles の Test Connection が対象のテーブルを確認します。AWS に接続するインストールを参照してください。パラメータを省くことと空文字列を渡すことは別物です — このエラーを起こすのは後者だけです。

出典

関連するエラー

参考資料

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。