Postgresql
如何在 PostgreSQL 中獲取 regclass 類型表的模式名稱?
在編寫一個函式來測試表中是否
col_name
存在列時_tbl
,我想提取表的模式名稱,該名稱作為regclass
參數傳遞給函式(為了安全??)。CREATE OR REPLACE FUNCTION column_exists(_tbl regclass, col_name text) RETURNS bool AS $func$ SELECT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_schema=get_schema($1) AND table_name=get_table($1) AND column_name=$2 ); $func$ LANGUAGE sql;
所以如果表名是
'staging.my_table'::regclass
,我想staging
從一個虛構的函式中得到get_schema
。我可以案例如實現這個功能
split_part(_tbl::text, '.', 1)
嗎?此外,是否保證表名
_tbl
在轉換為文本時始終具有模式名稱?(即不省略諸如 之類的東西public.
)我對
regclass
類型不是很熟悉。我搜尋但找不到如何提取模式名稱,只是想在重新發明輪子之前先問一下。
我可以案例如實現這個功能
split_part(_tbl::text, '.', 1)
嗎?我不確定那是否安全。相反,我會使用,
SELECT nspname FROM pg_catalog.pg_class AS c JOIN pg_catalog.pg_namespace AS ns ON c.relnamespace = ns.oid WHERE c.oid = _tbl;
這是保證工作。
在編寫一個函式來測試表中是否
col_name
存在列時_tbl
,我想提取表的模式名稱,該名稱作為 regclass 參數傳遞給函式(為了安全??)。所以你可以做類似的事情,
SELECT nspname FROM pg_catalog.pg_attribute AS a JOIN pg_catalog.pg_class AS c ON a.attrelid = c.oid JOIN pg_catalog.pg_namespace AS ns ON c.relnamespace = ns.oid WHERE c.oid = _tbl AND a.attname = col_name;
更新
如果你有一個完全限定的標識符,一個包含表名和模式名的標識符,你可以使用
parse_ident
它來安全地解析它。