同じ番号の再利用と個数の不一致
WHERE 句で $1 を 2 回使い、渡す値は 3 個にしてしまった例です。同じ番号の再利用が誤りではないことと、個数が合わない警告の両方を確かめます。
入力
SQL
UPDATE t SET a = $1 WHERE b = $2 OR c = $1
数える書き方
$1, $2…(PostgreSQL の位置パラメータ)だけ
実際に渡す値の個数(任意)
3
結果
エラー 0 件・警告 1 件・情報 1 件
指摘(エラー・警告・情報)
- 情報 全体 $1 は複数回出てきます。同じ番号は同じ値を指すので、渡す値は 1 つで足ります。
- 警告 渡す値の個数 渡す値は 3 個ですが、最大番号は $2 です。個数が合わないときの厳密な動作は PREPARE のページに記載がないため、実際に使う DB・ドライバーで確認してください。
| 最大番号 | $2 |
|---|---|
| 使われている番号の数 | 2 個 |
| 欠番 | なし |
プレースホルダの一覧
| プレースホルダ | 出現回数 | 行 |
|---|---|---|
| $1 | 2 | 1 行目 |
| $2 | 1 | 1 行目 |
検算(この結果になる理由)
$1 が 2 回、$2 が 1 回で、最大番号は $2 です。同じ番号の複数回の使用は情報 1 件で、渡す値 3 個と最大番号 2 の不一致が警告 1 件になります。番号の欠番はありません。
判定の根拠は仕様と根拠に、仕様の出典とともにまとめています。自分の入力で試すにはツールをお使いください。
このツールの制約
- 型の推論(PREPARE の型リストと実際の値の型の対応)は判定しません。番号と個数を数えるだけです。
- 完全な SQL の構文解析はしません。関数本体の $1 など、文脈で意味が変わる使い方は字句のとおりに数えます。
- ? と :名前 は PostgreSQL 自体の記法ではなく、ドライバーなどの別の層の書き方です。数えるのは見つけた個数だけで、仕様の根拠はありません。
- 貼り付けた SQL の実行や、DB への接続はできません。
ご利用にあたって
- 結果は字句の読み取りにもとづく確認で、実際のクエリが正しく実行できることを保証するものではありません。
- ドキュメントは PostgreSQL License で公開されています。このサイトはその内容を要約して参照しており、転載はしていません。