Oracleで特定のカラムがどのテーブルに存在するかを調べるには、データディクショナリビュー ALL_TAB_COLUMNS(または USER_TAB_COLUMNS / DBA_TAB_COLUMNS)を使います。本記事では完全一致・部分一致・データ型絞り込み・EXISTS判定など実務で役立つクエリパターンを網羅します。
使用するビューの使い分け
| ビュー名 |
参照できる範囲 |
OWNER列 |
必要権限 |
| USER_TAB_COLUMNS |
自分が所有するテーブル・ビューの列 |
なし |
なし |
| ALL_TAB_COLUMNS |
アクセス権のある全スキーマの列 |
あり |
なし |
| DBA_TAB_COLUMNS |
DB内の全スキーマの列 |
あり |
DBA権限 |
大文字・小文字の注意: Oracleのデータディクショナリはカラム名を大文字で格納しています。WHERE COLUMN_NAME = 'email' では一致しません。'EMAIL' と大文字で指定するか、UPPER(COLUMN_NAME) = UPPER('email') と書いてください。
カラム名を完全一致で検索する
SQL — 完全一致でカラムが存在するテーブルを一覧取得
-- アクセス可能な全スキーマから検索
SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE column_name = 'EMAIL'
ORDER BY owner, table_name;
-- 自スキーマのみ検索(シンプル版)
SELECT table_name, column_name
FROM user_tab_columns
WHERE column_name = 'EMAIL'
ORDER BY table_name;
カラム名を部分一致(LIKE)で検索する
SQL — LIKE で名前に特定文字列を含むカラムを検索
-- "ADDR" を含むカラムを検索
SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE column_name LIKE '%ADDR%'
ORDER BY owner, table_name;
-- "_ID" で終わるカラムをすべて取得
SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE column_name LIKE '%\_ID' ESCAPE '\' -- _ はワイルドカードなのでエスケープ
ORDER BY owner, table_name;
スキーマ・テーブルを絞り込んで検索する
SQL — スキーマ・テーブルを指定した絞り込み検索
-- 特定スキーマ内のみで検索
SELECT table_name, column_name
FROM all_tab_columns
WHERE owner = 'HR'
AND column_name = 'EMAIL';
-- 特定テーブルにカラムが存在するか確認
SELECT column_name
FROM all_tab_columns
WHERE owner = 'HR'
AND table_name = 'EMPLOYEES'
AND column_name = 'EMAIL';
カラムの詳細情報(型・桁・NULL・デフォルト値)も一緒に取得する
SQL — カラムの詳細情報を一覧取得
SELECT
owner,
table_name,
column_name,
column_id,
data_type
|| CASE
WHEN data_precision IS NOT NULL
THEN '(' || data_precision || ',' || data_scale || ')'
WHEN char_length > 0
THEN '(' || char_length || ')'
ELSE ''
END AS data_type_full,
nullable,
data_default
FROM all_tab_columns
WHERE column_name LIKE '%EMAIL%'
ORDER BY owner, table_name, column_id;
特定のデータ型を持つカラムを全テーブルから検索する
SQL — データ型を条件にしてカラムを検索
-- HRスキーマ内のCLOB型カラムをすべて検索
SELECT table_name, column_name, data_type
FROM all_tab_columns
WHERE owner = 'HR'
AND data_type = 'CLOB'
ORDER BY table_name;
-- DATE型またはTIMESTAMP型のカラムを検索
SELECT owner, table_name, column_name, data_type
FROM all_tab_columns
WHERE data_type IN ('DATE', 'TIMESTAMP')
AND owner NOT IN ('SYS', 'SYSTEM')
ORDER BY owner, table_name;
カラムの存在を TRUE / FALSE で判定する(EXISTS)
プログラムや手続きの中で「存在するかどうかだけ確認したい」場合は EXISTS を使います。
SQL — EXISTSでカラムの有無を確認
-- EMPLOYEES テーブルに EMAIL カラムが存在するか
SELECT
CASE
WHEN EXISTS (
SELECT 1 FROM all_tab_columns
WHERE owner = 'HR'
AND table_name = 'EMPLOYEES'
AND column_name = 'EMAIL'
) THEN '存在する'
ELSE '存在しない'
END AS column_exists
FROM dual;
複数テーブルにまたがる同名カラムを集計する
SQL — 同名カラムを持つテーブル数を集計
-- 各カラム名が何テーブルに存在するかカウント(上位20件)
SELECT column_name,
COUNT(*) AS table_count
FROM all_tab_columns
WHERE owner NOT IN ('SYS', 'SYSTEM', 'MDSYS')
GROUP BY column_name
ORDER BY table_count DESC
FETCH FIRST 20 ROWS ONLY;
まとめ
| 目的 |
クエリのポイント |
| 完全一致検索 |
WHERE column_name = ‘EMAIL’(大文字必須) |
| 部分一致検索 |
WHERE column_name LIKE ‘%ADDR%’ |
| 詳細情報も一緒に取得 |
data_type, char_length, nullable, data_default |
| 存在有無だけ確認 |
CASE WHEN EXISTS (…) THEN ‘存在する’ END |
| 自スキーマのみ調べる |
USER_TAB_COLUMNS(OWNER列なし、高速) |
❓ よくある質問(FAQ) ▲ クリックで開閉
Q. 検索してもヒットしないのはなぜか?
A. 最もよくある原因は大文字・小文字の不一致です。Oracleのデータディクショナリはカラム名を大文字で格納するため、WHERE column_name = 'email' ではヒットしません。'EMAIL' と大文字で指定するか、UPPER(column_name) = UPPER('email') で検索してください。
Q. ALL_TAB_COLUMNS と USER_TAB_COLUMNS のどちらを使えばよいか?
A. 自分のスキーマのテーブルだけを調べるなら USER_TAB_COLUMNS(OWNER列がなくシンプル)。他スキーマや広い範囲を調べるなら ALL_TAB_COLUMNS(OWNER列あり)を使います。DBA権限がある場合はDB全体を対象とする DBA_TAB_COLUMNS が最も網羅的です。
Q. ビューのカラムも同様に検索できるか?
A. はい。ALL_TAB_COLUMNS はテーブルだけでなくビュー(VIEW)の列も含みます。テーブルのみに絞りたい場合は ALL_TABLES や object_type = 'TABLE' で結合して絞り込んでください。