コマンド道場

$ 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_nameichiichi_pg
ノート00
ボールペン44
付箋00
デスクチェア00
書棚00
デスクライト00
キーボード00

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_nameato
ノート
ボールペンルペン
キーボードボード

3

0 を除いてから使わないと、切り出す位置がずれます。

説明

POSITION は、対象の中で探す文字列が最初に現れる位置を返します。位置は 1 から数えます。

⚠️ 見つからないときは 0 を返します。NULL ではありません。ここが多くのプログラミング言語(-1 を返すもの)と違うので、移してきたコードがそのままだと判定が反転します。

POSITION(... IN ...) が標準 SQL の書き方で、STRPOS(対象, 探す文字列) は PostgreSQL の短い形です。引数の順番が逆なので、書き換えるときは注意してください。

「含まれているか」だけを知りたいなら LIKE '%…%' のほうが読みやすくなります。POSITION が要るのは、何文字目かを使って切り出したいときです。

次に読む

根拠にした一次情報