コマンド道場

$ 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
statusdaiatama_dakeinitcap
cancelCANCELCancelCancel
doneDONEDoneDone

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
ikorulike_desorosoeteilike_de
falsefalsetruetrue

1

PostgreSQL はそのままでは区別します。そろえるか ILIKE を使ってください。

全角英字も変換される
SELECT UPPER('abc') AS zenkaku_mo, UPPER('straße') AS doitsugo
zenkaku_modoitsugo
ABCSTRAẞ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

製品ごとの対応表(根拠つき)を見る

次に読む

根拠にした一次情報