次のように、名簿を表すNAMELISTテーブルがあり、苗字(LAST_NAME)があ行始まりは何人か、か行始まりは何人か・・・、わ行始まりは何人か知りたいとする。使用DBはOracle。
これを実現したSQLは以下。
Oracleでは、正規表現はREGEXP_LIKE関数を使う。
先頭が「あいうえお」は「あ行」として扱い、先頭が「かきくけこ」は、「か行」として扱い・・・を列挙していく。その後、COUNTするのにGROUP BYする。
what_column_count.sql
SELECT CASE
WHEN REGEXP_LIKE(LAST_NAME, '^[あいうえお]') THEN 'あ行'
WHEN REGEXP_LIKE(LAST_NAME, '^[かきくけこ]') THEN 'か行'
WHEN REGEXP_LIKE(LAST_NAME, '^[さしすせそ]') THEN 'さ行'
WHEN REGEXP_LIKE(LAST_NAME, '^[たちつてと]') THEN 'た行'
WHEN REGEXP_LIKE(LAST_NAME, '^[なにぬねの]') THEN 'な行'
WHEN REGEXP_LIKE(LAST_NAME, '^[はひふへほ]') THEN 'は行'
WHEN REGEXP_LIKE(LAST_NAME, '^[まみむめも]') THEN 'ま行'
WHEN REGEXP_LIKE(LAST_NAME, '^[やゆよ]') THEN 'や行'
WHEN REGEXP_LIKE(LAST_NAME, '^[らりるれろ]') THEN 'ら行'
WHEN REGEXP_LIKE(LAST_NAME, '^[わ]') THEN 'わ行'
ELSE 'etc.' END AS WHAT_COLUMN,
COUNT(*)
FROM NAMELIST
GROUP BY CASE
WHEN REGEXP_LIKE(LAST_NAME, '^[あいうえお]') THEN 'あ行'
WHEN REGEXP_LIKE(LAST_NAME, '^[かきくけこ]') THEN 'か行'
WHEN REGEXP_LIKE(LAST_NAME, '^[さしすせそ]') THEN 'さ行'
WHEN REGEXP_LIKE(LAST_NAME, '^[たちつてと]') THEN 'た行'
WHEN REGEXP_LIKE(LAST_NAME, '^[なにぬねの]') THEN 'な行'
WHEN REGEXP_LIKE(LAST_NAME, '^[はひふへほ]') THEN 'は行'
WHEN REGEXP_LIKE(LAST_NAME, '^[まみむめも]') THEN 'ま行'
WHEN REGEXP_LIKE(LAST_NAME, '^[やゆよ]') THEN 'や行'
WHEN REGEXP_LIKE(LAST_NAME, '^[らりるれろ]') THEN 'ら行'
WHEN REGEXP_LIKE(LAST_NAME, '^[わ]') THEN 'わ行'
ELSE 'etc.' END
ORDER BY WHAT_COLUMN;
正規表現とCASEを上手く使えば、上記のようなことが実現できるということで備忘録として残しておいた。