$ man upper-lower
UPPER / LOWER
文字列関数英字を大文字・小文字にそろえる。比較で大文字小文字を無視したいときに使う。
呼び出しの形
UPPER(文字列) LOWER(文字列) INITCAP(文字列)
つまずきやすいところ
PostgreSQL の比較は大文字小文字を区別します。
=もLIKEも区別するので、無視したいなら両側をLOWERでそろえるかILIKEを使ってください。MySQL は既定で区別しません。 同じ SQL が製品によって違う件数を返します。
LOWER(列)を条件に書くと、その列のインデックスが使われなくなります。件数が多いなら式インデックスを検討してください。
実行例
結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。
SELECT DISTINCT status, UPPER(status) AS dai, UPPER(LEFT(status,1)) || SUBSTRING(status FROM 2) AS atama_dake, INITCAP(status) AS initcap FROM juchu ORDER BY status
| status | dai | atama_dake | initcap |
|---|---|---|---|
| cancel | CANCEL | Cancel | Cancel |
| done | DONE | Done | Done |
2 行
INITCAP は単語の先頭だけを大文字にします。
SELECT 'ABC' = 'abc' AS ikoru, 'ABC' LIKE 'abc' AS like_de, LOWER('ABC') = LOWER('abc') AS sorosoete, 'ABC' ILIKE 'abc' AS ilike_de| ikoru | like_de | sorosoete | ilike_de |
|---|---|---|---|
| false | false | true | true |
1 行
PostgreSQL はそのままでは区別します。そろえるか ILIKE を使ってください。
SELECT UPPER('abc') AS zenkaku_mo, UPPER('straße') AS doitsugo| zenkaku_mo | doitsugo |
|---|---|
| ABC | STRAẞE |
1 行
1 文字が別の文字に変わることもあります(ß は ẞ になります)。
説明
UPPER は大文字に、LOWER は小文字にそろえます。INITCAP は各単語の先頭だけを大文字にします。
⚠️ PostgreSQL の比較は大文字小文字を区別します。'ABC' = 'abc' も 'ABC' LIKE 'abc' も偽です。区別せずに探したいなら、両側を LOWER で揃えるか ILIKE を使います。⚠️ ただし MySQL は既定の照合順序で区別しません。同じ SQL が製品によって違う件数を返すので、移植時にいちばん気づきにくい差の 1 つです。
⚠️ 列に LOWER を掛けると、その列のインデックスが使えなくなります。件数が多い表で毎回変換するなら、LOWER(列) に対する式インデックスを作るか、最初から小文字で持つことを検討してください。
変換はロケールに依存します。全角の英字も変換され、ドイツ語の ß のように 1 文字が別の文字に変わる場合もあります。
ほかの製品でも通るか
未確認の製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database
未確認: IBM Db2
次に読む
根拠にした一次情報
- PostgreSQL 18 マニュアル: 文字列関数と演算子(2026-09-02 確認)