Home > データベース > 【PostgreSQL】フィールド一覧の取得

【PostgreSQL】フィールド一覧の取得

PostgreSQLで、フィールド一覧を取得する方法です。
TABLEのみが対象になります。

フィールドサイズの取得は、面倒なのですがフィールドタイプで固定な数値を割り振りました。

「@TABLE_NAME」は、バインド変数なので、対象としたいテーブル名を入れてください。2箇所あるので注意してください。

SELECT 
    A.FIELD_NAME, 
    A.FIELD_TYPE, 
    CASE WHEN A.FIELD_SIZE IS NULL THEN 0 ELSE A.FIELD_SIZE END AS FIELD_SIZE, 
    CASE WHEN B.IS_PK IS NULL THEN 0 ELSE B.IS_PK END AS IS_PK, 
    A.IS_NULLABLE 
FROM 
    (
    SELECT 
        PG_CLASS.RELNAME AS TABLE_NAME, 
        PG_ATTRIBUTE.ATTNUM AS FIELD_NUM, 
        PG_ATTRIBUTE.ATTNAME AS FIELD_NAME, 
        PG_TYPE.TYPNAME AS FIELD_TYPE, 
        CASE WHEN PG_TYPE.TYPNAME = 'bpchar' THEN PG_ATTRIBUTE.ATTTYPMOD-4 
            WHEN PG_TYPE.TYPNAME = 'varchar' THEN PG_ATTRIBUTE.ATTTYPMOD-4 
            WHEN PG_TYPE.TYPNAME = 'numeric' THEN ( PG_ATTRIBUTE.ATTTYPMOD-4 ) / 65536 
            WHEN PG_TYPE.TYPNAME = 'decimal' THEN ( PG_ATTRIBUTE.ATTTYPMOD-4 ) / 65536 
            WHEN PG_TYPE.TYPNAME = 'date' THEN 10 
            WHEN PG_TYPE.TYPNAME = 'time' THEN 8 
            WHEN PG_TYPE.TYPNAME = 'timestamp' THEN 19 
            WHEN PG_TYPE.TYPNAME = 'bool' THEN 1 END AS FIELD_SIZE, 
        CASE WHEN PG_ATTRIBUTE.ATTNOTNULL = TRUE THEN 0 
            WHEN PG_ATTRIBUTE.ATTNOTNULL = FALSE THEN 1 END AS IS_NULLABLE 
    FROM 
        PG_CLASS INNER JOIN PG_ATTRIBUTE ON PG_ATTRIBUTE.ATTRELID = PG_CLASS.OID 
        INNER JOIN PG_TYPE ON PG_TYPE.OID = PG_ATTRIBUTE.ATTTYPID 
    WHERE 
        PG_CLASS.RELNAME = @TABLE_NAME AND 
        PG_ATTRIBUTE.ATTNUM >= 0 AND 
        PG_CLASS.RELKIND = 'r' 
    ) AS A LEFT JOIN 
    (
    SELECT 
        PG_CLASS.RELNAME AS TABLE_NAME, 
        PG_ATTRIBUTE.ATTNUM AS FIELD_NUM, 
        PG_ATTRIBUTE.ATTNAME AS FIELD_NAME, 
        1 AS IS_PK 
    FROM 
        PG_CLASS INNER JOIN PG_ATTRIBUTE ON PG_ATTRIBUTE.ATTRELID = PG_CLASS.OID 
        INNER JOIN PG_CONSTRAINT ON PG_CLASS.OID = PG_CONSTRAINT.CONRELID 
    WHERE 
        PG_CLASS.RELNAME = @TABLE_NAME AND 
        PG_CONSTRAINT.CONTYPE = 'p' AND 
        PG_ATTRIBUTE.ATTNUM = ANY(PG_CONSTRAINT.CONKEY)
    ) AS B ON A.TABLE_NAME = B.TABLE_NAME AND A.FIELD_NUM = B.FIELD_NUM 
ORDER BY 
    A.TABLE_NAME, 
    A.FIELD_NUM

Comments:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://magicbox.sakura.ne.jp/mt/mt-tb.cgi/496
Listed below are links to weblogs that reference
【PostgreSQL】フィールド一覧の取得 from 爆裂!C#野郎

Home > データベース > 【PostgreSQL】フィールド一覧の取得

Search
Feeds
Tag Cloud
Recommend

SQLパズル 第2版 プログラミングが変わる書き方/考え方
SQLパズル 第2版 プログラミングが変わる書き方/考え方

ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系
ソフトウェアアーキテクチャ―ソフトウェア開発のためのパターン体系

ITアーキテクト vol.1
ITアーキテクト vol.1

オブジェクト指向における再利用のためのデザインパターン
オブジェクト指向における再利用のためのデザインパターン

増補改訂版 Java言語で学ぶデザインパターン入門
増補改訂版 Java言語で学ぶデザインパターン入門

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編

J2EEデザインパターン
J2EEデザインパターン

アンチパターン―ソフトウェア危篤患者の救出
アンチパターン―ソフトウェア危篤患者の救出

世界でいちばん簡単なネットワークのe本―ネットワークとTCP/IPの基本と考え方がわかる本
世界でいちばん簡単なネットワークのe本―ネットワークとTCP/IPの基本と考え方がわかる本

Return to page top