snippetsqlModerate
How to get the schema name of a table of type regclass in PostgreSQL?
Viewed 0 times
postgresqlthetableregclasstypegetnamehowschema
Problem
In writing a function to test if a column
So if the table name is
Can I just implement this function with e.g.
In addition, is it guaranteed that the table name
I'm not very familiar with the
col_name exists in a table _tbl, I'd like to extract the table's schema name, which is passed into the function as a regclass parameter (for security??).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;So if the table name is
'staging.my_table'::regclass, I'd like to get staging from an imaginary function get_schema.Can I just implement this function with e.g.
split_part(_tbl::text, '.', 1)?In addition, is it guaranteed that the table name
_tbl, when converted to text, will always have a schema name? (i.e. not omitting things such as public.)I'm not very familiar with the
regclass type. I searched but couldn't find how to extract the schema name, and just wanted to ask first before re-inventing wheels.Solution
To further simplify, you could use a cast to
Casting an object identifier type to
But you don't need any of this if you work with
Simpler, shorter, faster.
regnamespace - another object identifier type introduced with Postgres 9.5SELECT relnamespace::regnamespace::text
FROM pg_catalog.pg_class
WHERE oid = _tbl;Casting an object identifier type to
text produces a fully qualified (only if the current search_path requires it) and double-quoted (only if necessary) string.But you don't need any of this if you work with
pg_attribute directly:CREATE OR REPLACE FUNCTION column_exists(_tbl regclass, _col_name text)
RETURNS bool
LANGUAGE sql AS
$func$
SELECT EXISTS (
SELECT FROM pg_catalog.pg_attribute
WHERE attrelid = _tbl
AND attname = _col_name
);
$func$;Simpler, shorter, faster.
Code Snippets
SELECT relnamespace::regnamespace::text
FROM pg_catalog.pg_class
WHERE oid = _tbl;CREATE OR REPLACE FUNCTION column_exists(_tbl regclass, _col_name text)
RETURNS bool
LANGUAGE sql AS
$func$
SELECT EXISTS (
SELECT FROM pg_catalog.pg_attribute
WHERE attrelid = _tbl
AND attname = _col_name
);
$func$;Context
StackExchange Database Administrators Q#200169, answer score: 13
Revisions (0)
No revisions yet.