quote_ident()
地味ですが有り難い関数です。たまに環境によっては、テーブル名やカラム名をダブルクォーテーションで囲まないとならない場合があります。例えば以下のようにテーブル名に日本語を使うようなケースです。このような時、information_schema.columnsや、pg_tablesを使って動的SQLを作成する場合重宝します。
-- 以下テーブルを作成します。
create table sooni."社員表" (
"社員番号" character varying(10)
,"社員名" character varying(10)
,mobile character VARYING(11)
);
--
-- 普通にテーブル名を参照するとこんな感じ
--
myposdb=# select schemaname,tablename
myposdb-# from pg_tables t where t.tablename='社員表';
schemaname | tablename
------------+-----------
sooni | 社員表
(1 行)
--
-- quote_ident()を使うとこんな感じ
--
myposdb=# select schemaname,quote_ident(tablename) tablename
myposdb-# from pg_tables t where t.tablename='社員表';
schemaname | tablename
------------+-----------
sooni | "社員表"
(1 行)
--
-- 普通にカラム名を参照するとこんな感じ
--
myposdb=# select dtd_identifier,column_name,data_type
myposdb-# from information_schema.columns
myposdb-# where table_name='社員表';
dtd_identifier | column_name | data_type
----------------+-------------+-------------------
1 | 社員番号 | character varying
2 | 社員名 | character varying
3 | mobile | character varying
(3 行)
--
-- quote_ident()を使うとこんな感じ
-- 必要な場合のみダブルクォーテーションで囲んでくれるのがうれしい
--
myposdb=# select dtd_identifier,quote_ident(column_name) column_name,data_type
myposdb-# from information_schema.columns
myposdb-# where table_name='社員表';
dtd_identifier | column_name | data_type
----------------+-------------+-------------------
1 | "社員番号" | character varying
2 | "社員名" | character varying
3 | mobile | character varying
(3 行)
myposdb=#