【Oracle】指定したカラム名が存在するか確認する方法|ALL_TAB_COLUMNS・型・NULL・複数条件検索まで完全解説

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_TABLESobject_type = 'TABLE' で結合して絞り込んでください。