$ man position
POSITION / STRPOS
文字列関数文字列の中で、指定した文字列が最初に現れる位置を返す。見つからないと 0。
呼び出しの形
POSITION(探す文字列 IN 対象) STRPOS(対象, 探す文字列)
つまずきやすいところ
見つからないときは 0 です。-1 でも NULL でもありません。
> 0で「見つかった」を判定してください。STRPOSは PostgreSQL 固有で、引数の順番がPOSITIONと逆です。位置は 1 から数えます。0 から数える言語の感覚で使うと 1 文字ずれます。
実行例
結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。
SELECT shohin_name, POSITION('ペン' IN shohin_name) AS ichi, STRPOS(shohin_name, 'ペン') AS ichi_pg FROM shohin ORDER BY shohin_id| shohin_name | ichi | ichi_pg |
|---|---|---|
| ノート | 0 | 0 |
| ボールペン | 4 | 4 |
| 付箋 | 0 | 0 |
| デスクチェア | 0 | 0 |
| 書棚 | 0 | 0 |
| デスクライト | 0 | 0 |
| キーボード | 0 | 0 |
7 行
見つからない商品では 0 になります。NULL ではありません。
SELECT shohin_name, SUBSTRING(shohin_name FROM POSITION('ー' IN shohin_name) + 1) AS ato FROM shohin WHERE POSITION('ー' IN shohin_name) > 0 ORDER BY shohin_id| shohin_name | ato |
|---|---|
| ノート | ト |
| ボールペン | ルペン |
| キーボード | ボード |
3 行
0 を除いてから使わないと、切り出す位置がずれます。
説明
POSITION は、対象の中で探す文字列が最初に現れる位置を返します。位置は 1 から数えます。
⚠️ 見つからないときは 0 を返します。NULL ではありません。ここが多くのプログラミング言語(-1 を返すもの)と違うので、移してきたコードがそのままだと判定が反転します。
POSITION(... IN ...) が標準 SQL の書き方で、STRPOS(対象, 探す文字列) は PostgreSQL の短い形です。引数の順番が逆なので、書き換えるときは注意してください。
「含まれているか」だけを知りたいなら LIKE '%…%' のほうが読みやすくなります。POSITION が要るのは、何文字目かを使って切り出したいときです。
次に読む
根拠にした一次情報
- PostgreSQL 18 マニュアル: 文字列関数と演算子(2026-09-02 確認)