0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PostgreSQL 覚え書き[テブール調査/sql作成]

Last updated at Posted at 2021-08-26

初めに

こちらのSQLはテーブル調査等に使用したときのSQLです
・A5-Mk2で使いやすい感じで書いています

テーブル一覧検索SQL

テーブル一覧取得

指定したスキーマ等のテーブル一覧を出力します。

設定

スキーマ名の指定はなしでもできますが、する場合は
SchemaName 」で行います

--スキーマ名 ※全ての時は「''」
--*SetParameter SchemaName 'スキーマ名' S

同じくテーブル名称で検索したい場合は
LikeTblName 」で行います

--検索テーブル名(英語or日本語)
-- 一覧で表示する場合は「'%%'」で検索
--*SetParameter LikeTblName '%テーブル名%' S

SQL文

テーブル一覧取得.sql

-- ==========================================
-- 機能:テーブル名一覧取得
--
--*DataTitle テーブル名
-- 
-- ==========================================

--スキーマ名 ※全ての時は「''」
--*SetParameter SchemaName '' S

--検索テーブル名(英語or日本語)
-- 一覧で表示する場合は「'%%'」で検索
--*SetParameter LikeTblName '%%' S

select
     trim(A.schemaname)   as  スキーマ     --schema
    ,trim(B.description)  as  論理名       --TABLE_COMMENT
    ,trim(A.relname)      as  物理名       --TABLE_NAME
    ,UPPER(A.relname)     as  物理名大文字 --U_TABLE_NAME
from
	 pg_stat_user_tables A
	,pg_description B
where
	A.relname in (
		select 
			relname as TABLE_NAME
		from 
			pg_stat_user_tables
	)
   --スキーマ名
   and case 
          WHEN @SchemaName = '' THEN 1=1
          ELSE A.schemaname = current_schema() 
       END
	and A.relid=B.objoid
	and B.objsubid=0
    and ( UPPER(A.relname) like UPPER(@LikeTblName) --物理名(日本語) 
         OR B.description like @LikeTblName         --論理名(英語)
         ) 
order by A.relname
;


テーブル定義取得

テーブル定義取得(その1)

設定

こちらは「【テーブル名】」の部分にテーブル名称を入れると取得できます

--【テーブル名】
--*SetParameter tblName 'テーブル名(英語)' S

SQL文

テーブル定義取得.sql
-- ==================================================
--*DataTitle カラム名取得(定義書風)
-- ※テーブルのカラム一覧を取得する
-- ==================================================

--【テーブル名】
--*SetParameter tblName 'TBL_XXXXX' S

select
--※テーブルのカラム一覧を取得のとき
    COLUMNS.ordinal_position                                      as 連番
   ,trim(COLUMNS.table_schema)                                    as スキーマ
   ,substr(DESCRI.description,1,strpos(DESCRI.description,':')-1) as 物理名
   ,COLUMNS.column_name                                           as 論理名
   ,COLUMNS.data_type                                             as タイプ
   ,COLUMNS.udt_name                                              as 
   ,COLUMNS.is_nullable                                           as "NotNull"
   ,substr(DESCRI.description,strpos(DESCRI.description,':')+1)   as コメント

from
  pg_stat_user_tables TABLES
 ,information_schema.columns COLUMNS
 ,pg_description DESCRI
where 1=1
  and TABLES.relname=COLUMNS.table_name
  and TABLES.relid  = DESCRI.objoid 
  and COLUMNS.ordinal_position=DESCRI.objsubid
  and TABLES.schemaname = current_schema()
  and COLUMNS.table_schema = current_schema()
  and TABLES.relname = LOWER(@tblName)
order by COLUMNS.ordinal_position
;

テーブル定義取得(その2)

設定1

同じようにテーブル名を設定します。

--【テーブル名】
--*SetParameter tblName 'テーブル名(英語)' S

設定2

今回別なパターンでコメント部分の記述が違っていて「:」の区切りでは
上手に取得できなかったので「項目区切り文字」「コメント区切り文字」を追加しました。

--テーブル項目区切り文字
--*SetParameter tblNameDelimiter '論理名称:' S
--コメント項目区切り文字
--*SetParameter commentDelimiter 'コメント:' S

SQL文

テーブル定義取得その2.sql

-- ==================================================
--*DataTitle TBL定義書風
-- ※テーブルのカラム一覧を取得する
--
--【出力イメージ】
--  定義書風の感じ
-- ==================================================

-- ■■■■■■■■■■■■■■■■■■■■■■■■■■
--【パラメータ:テーブル名】
--*SetParameter tblName 'TBL_XXXXX' S
--
-- ■■■■■■■■■■■■■■■■■■■■■■■■■■
--テーブル項目区切り文字
--*SetParameter tblNameDelimiter '論理名称:' S
--コメント項目区切り文字
--*SetParameter commentDelimiter 'コメント:' S


select
    0                                               as "No."
   ,'※テーブル情報'                                as 物理名
   ,'【スキーマ:'|| trim(A.schemaname)     || '】' as 論理名
   ,'【物理名:'  || trim(B.description)    || '】' as タイプ
   ,'【論理名:'  || trim(upper(A.relname)) || '】' as 
   ,null                                            as 文字数   
   ,null                                            as 整数
   ,null                                            as 少数
   ,''                                              as "NotNull"
   ,''                                              as コメント    
from
	 pg_stat_user_tables A
	,pg_description B
where
	A.relname in (
		select 
			relname as TABLE_NAME
		from 
			pg_stat_user_tables
	)
	and A.schemaname = current_schema()
	and A.relid=B.objoid
	and B.objsubid=0
    and UPPER(A.relname) = UPPER(@tblName)
union all
select
--※テーブルのカラム一覧を取得のとき
    COLUMNS.ordinal_position                                      as "No."
    ,case 
       when strpos(DESCRI.description,@commentDelimiter) > 0 then
          substr(DESCRI.description
                ,strpos(DESCRI.description,@tblNameDelimiter)+char_length(@tblNameDelimiter)
                ,strpos(DESCRI.description,@commentDelimiter)-char_length(@commentDelimiter)
                )

       else
          substr(DESCRI.description
                ,strpos(DESCRI.description,@tblNameDelimiter)+char_length(@tblNameDelimiter)
          ) 
    END as 物理名
   ,trim(COLUMNS.column_name)                                     as 論理名
   ,COLUMNS.data_type                                             as タイプ
   ,COLUMNS.udt_name                                              as 
   ,COLUMNS.character_maximum_length                              as 文字数   
   ,COLUMNS.numeric_precision                                     as 整数
   ,COLUMNS.numeric_scale                                         as 少数
   ,COLUMNS.is_nullable                                           as "NotNull"
   ,case 
    when strpos(DESCRI.description,@commentDelimiter) > 0 then
         substr(DESCRI.description
            ,strpos(DESCRI.description,@commentDelimiter)+char_length(@commentDelimiter)
             )
    else
        ''
    END as コメント
from
  pg_stat_user_tables TABLES
 ,information_schema.columns COLUMNS
 ,pg_description DESCRI
where 1=1
  and TABLES.relname=COLUMNS.table_name
  and TABLES.relid  = DESCRI.objoid 
  and COLUMNS.ordinal_position=DESCRI.objsubid
  and TABLES.schemaname = current_schema()
  and COLUMNS.table_schema = current_schema()
  and TABLES.relname = LOWER(@tblName)
order by "No."
;

テーブル・カラム調査SQL

該当カラム存在テーブル日本語検索

カラム存在テーブル日本語検索.sql

-- ==========================================
-- 機能:該当カラム存在テーブル一覧
-- 該当カラムを検索する
-- ==========================================

-------------------------------------
--*DataTitle カラム検索 [日本語]
-------------------------------------
--検索カラム名(日本語)
--*SetParameter columnNameJpn 'コード%' S
select
    trim(UTBL.schemaname)          as スキーマ名
   ,trim(SCOL.table_name)          as テーブル名
   ,SCOL.ordinal_position          as 連番
   ,trim(COLEN.column_name)        as カラム名
   ,COLJP.ColName                  as 物理名
   ,COLEN.is_nullable              as Not_NULL
   ,COLEN.data_type                as データタイプ
   ,COLEN.character_maximum_length as 最大文字列
   ,COLEN.numeric_precision        as 数値数
from
  pg_stat_user_tables UTBL
 ,information_schema.columns SCOL

 ,(select 
     substr(description,1,strpos(description,':')-1) as ColName,*
    from pg_description 
    where description like @columnNameJpn
    )COLJP

  ,(SELECT COL.* 
     from information_schema.columns COL 
     where 1=1
       and COL.table_schema = current_schema() 
    )COLEN

where 1=1
  and UTBL.relname            = SCOL.table_name
  and UTBL.relid              = COLJP.objoid 
  and SCOL.ordinal_position   = COLJP.objsubid
  and UTBL.schemaname         = SCOL.table_schema
  and COLEN.table_catalog    = SCOL.table_catalog
  and COLEN.table_name       = SCOL.table_name 
  and COLEN.ordinal_position = SCOL.ordinal_position 
  and UTBL.schemaname         = current_schema()
  and COLJP.ColName like @columnNameJpn

order by SCOL.table_name,SCOL.ordinal_position

;

該当カラム存在テーブル英語検索

カラム存在テーブル英語検索.sql

-----------------------------
--*DataTitle カラム検索[英語]
----------------------------
--検索カラム名(英語)
--*SetParameter columnNameEng 'code%' S

SELECT
     trim(A.table_schema)      as スキーマ名
    ,trim(A.column_name)       as カラム名
    ,A.ordinal_position        as カラム位置
    ,trim(A.table_name)        as テーブル名
    ,C.description             as テーブ日本語名
    ,A.is_nullable             as NotNULL
    ,A.data_type               as データタイプ
    ,A.character_maximum_length as 最大文字列
    ,A.numeric_precision        as 数値数
FROM
    information_schema.columns A
    ,pg_stat_user_tables B
    ,pg_description C
WHERE 1=1
    and A.table_schema = B.schemaname
    and A.table_name = B.relname
    and A.table_schema = current_schema()
    and A.column_name like @columnNameEng 
    and B.relid = C.objoid
    and C.objsubid=0

ORDER BY
    A.table_name
;

Select文作成SQL

A5-MK疑似命令用

A5-MK疑似命令のみ.sql
-- ==================================================
--*DataTitle カラム名取得(A5MK用)
-- ※テーブルのカラム一覧を取得し
-- A5MKの疑似命令でカラム名表示を行うCaptionsを作成
--
--【出力イメージ】
-- | -- 取得スキーマ:XXXXXXX
-- | --*Captions 会社コード,品目名,…
-- ==================================================

-- ■■■■■■■■■■■■■■■■■■■■■■■■■■
--【パラメータ:テーブル名】
--*SetParameter tblName 'TBL_XXXXX' S
--
-- ■■■■■■■■■■■■■■■■■■■■■■■■■■

select '-- 取得スキーマ:' || current_schema()                               as "-- A5MK用"
union all
select 
    concat('--*Captions ' , ARRAY_TO_STRING(ARRAY_AGG(TBL_COL.物理名),','))  as "-- A5MK用"
from (
    select
       substr(DESCRI.description,1,strpos(DESCRI.description,':')-1) as 物理名
       ,COLUMNS.ordinal_position as 連番
    from
      pg_stat_user_tables TABLES
     ,information_schema.columns COLUMNS
     ,pg_description DESCRI
    where 1=1
      and TABLES.relname=COLUMNS.table_name
      and TABLES.relid  = DESCRI.objoid 
      and COLUMNS.ordinal_position=DESCRI.objsubid
      and TABLES.schemaname = current_schema()
      and COLUMNS.table_schema = current_schema() 
      and TABLES.relname = LOWER(@tblName)
    order by COLUMNS.ordinal_position
    ) as TBL_COL
;

Select文作成[A5-MK疑似命令でカラム名].sql

-- ==================================================
-- 機能:Select文作成(A5MK用)
-- 内容:A5MKの疑似命令指定でのカラム名設定と
--      Select文を作成する
--
--【出力イメージ】
-- |-- ----------------------------
-- |--*DataTitle テーブル名
-- |-- 取得スキーマ:XXXXXXX
-- |-- ----------------------------
-- |--*Captions 会社名,品目名,更新日,…
-- |Select A.*
-- |from TBL_XXXXX A
-- |where 1 = 1
-- |;
-- ==================================================

-- ■■■■■■■■■■■■■■■■■■■■■■■■■■
--【パラメータ:テーブル名】
--*SetParameter tblName 'TBL_XXXXX' S
--
-- ■■■■■■■■■■■■■■■■■■■■■■■■■■


select 
    '-- ----------------------------'as ";"
-- --------------------------------------
union all
select
    '--*DataTitle ' || B.description as ";"
from
	 pg_stat_user_tables A
	,pg_description B
where
	A.relname in (
		select 
			relname as TABLE_NAME
		from 
			pg_stat_user_tables
	)
	and A.schemaname = current_schema()
	and A.relid=B.objoid
	and B.objsubid=0
    and UPPER(A.relname) = UPPER(@tblName)
-- --------------------------------------
union all
select '-- 取得スキーマ:' || current_schema() as ";"
union all
select '-- ----------------------------'as ";"
union all
-- --------------------------------------
-- カラム名取得(A5MK用)
-- ------------------------------------------------------
select 
    '--*Captions ' || ARRAY_TO_STRING(ARRAY_AGG(TBL_COL.物理名),',') as ";"
from (
    select
       substr(DESCRI.description,1,strpos(DESCRI.description,':')-1) as 物理名
       ,COLUMNS.ordinal_position as 連番
    from
      pg_stat_user_tables TABLES
     ,information_schema.columns COLUMNS
     ,pg_description DESCRI
    where 1=1
      and TABLES.relname=COLUMNS.table_name
      and TABLES.relid  = DESCRI.objoid 
      and COLUMNS.ordinal_position=DESCRI.objsubid
      and TABLES.schemaname = current_schema()
      and COLUMNS.table_schema = current_schema()
      and TABLES.relname = LOWER(@tblName)
    order by COLUMNS.ordinal_position
    ) as TBL_COL
-- --------------------------------------
union all
select 'Select A.*' as ";"
-- --------------------------------------
union all
select 'from ' || @tblName || ' A' as ";"
-- --------------------------------------
union all
select 'where 1 = 1' as ";"
union all
select ';'as ";"
;

カラム名 as 句で日本語化

Select文作成[A5-MK_AS句でカラム名].sql

-- ==================================================
--*DataTitle Select文作成(カラム名)
--
-- Select文作成[カラム名込み]
-- 機能:Select文作成(カラム名)
-- 内容:カラムを「Select *」にしないで 
--      「[物理名] as [論理名]」で,Select文を作成する
--
--【出力イメージ】
-- |-- ----------------------------
-- |--*DataTitle 取得テーブル名称
-- |-- 取得スキーマ:XXXXXXX
-- |-- ----------------------------
-- |Select 
-- |   ,A.kaisya    as 会社コード
-- |   ,A.syohin    as 商品コード
-- |from T_TBL_NAME A
-- |where 1 = 1
-- ;
-- ==================================================

-- ■■■■■■■■■■■■■■■■■■■■■■■■■■
--【パラメータ:テーブル名】
--*SetParameter tblName 'TBL_XXXXX' S
--
-- ■■■■■■■■■■■■■■■■■■■■■■■■■■
select '-- ----------------------------'as  ";"
-- --------------------------------------
union all
select
    '--*DataTitle ' || B.description || '[' || @tblName || ']'  as ";"
from
	 pg_stat_user_tables A
	,pg_description B
where
	A.relname in (
		select 
			relname as TABLE_NAME
		from 
			pg_stat_user_tables
	)
	and A.schemaname = current_schema()
	and A.relid=B.objoid
	and B.objsubid=0
    and UPPER(A.relname) = UPPER(@tblName)
-- --------------------------------------
union all
select '-- 取得スキーマ:' || current_schema() as ";"
union all
select '-- ----------------------------'as  ";"
-- --------------------------------------
union all
select 'Select 'as ColName
-- --------------------------------------
union all
select A. ";"
from (
    select
      case when COLUMNS.ordinal_position = 1  then
        --【表示方法】: A.[物理名] as  [論理名]  => 「as」 を 「--」にするとコメント表示になる
        -- コメント位置を合わせるのに20文字の空白埋めをする
        '   A.' || case when length(COLUMNS.column_name) > 20  then 
                         COLUMNS.column_name 
                         else  rpad(COLUMNS.column_name,20) 
                    end  
                || ' as ' || substr(DESCRI.description,1,strpos(DESCRI.description,':')-1) 

       else
        '  ,A.' || case when length(COLUMNS.column_name) > 20  then 
                         COLUMNS.column_name 
                         else  rpad(COLUMNS.column_name,20) 
                    end  
                || ' as ' || substr(DESCRI.description,1,strpos(DESCRI.description,':')-1) 
      end as  ";"
    from
      pg_stat_user_tables TABLES
     ,information_schema.columns COLUMNS
     ,pg_description DESCRI
    where 1=1
      and TABLES.relname=COLUMNS.table_name
      and TABLES.relid  = DESCRI.objoid 
      and COLUMNS.ordinal_position=DESCRI.objsubid
      and TABLES.schemaname = current_schema()
      and COLUMNS.table_schema = current_schema()
      and TABLES.relname = LOWER(@tblName)
    order by COLUMNS.ordinal_position
)A
-- --------------------------------------
union all
select 'from ' || @tblName || ' A' as  ";"
-- --------------------------------------
union all
select 'where 1 = 1' as  ";"
union all
select ';'as ";"
;

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?