如何将regclass转换为不带引号的字符串?

时间:2019-05-04 10:03:03

标签: postgresql formatting

我有存储过程:

create or replace function make_bi_temporal( _tbl regclass )
returns void as $$
BEGIN
execute format( 'alter table %s drop constraint if exists %s_pkey', _tbl, _tbl );
...

但是运行select make_bi_temporal( 'check' )

时出现错误
ERROR:  syntax error at or near "_pkey"
LINE 1: alter table "check" drop constraint if exists "check"_pkey

我尝试将%s更改为%I

ERROR:  syntax error at or near "_pkey"
LINE 1: ...ter table "check" drop constraint if exists """check"""_pkey

%L

ERROR:  syntax error at or near "'"check"'"
LINE 1: alter table "check" drop constraint if exists '"check"'_pkey

我想得到check_pkey

如何设置不带引号的格式?

2 个答案:

答案 0 :(得分:0)

似乎通过正则表达式找到了解决方案:

regexp_replace( _tbl::text, '"', '', 'g' )


execute format( 'alter table %s drop constraint if exists %s_pkey', _tbl, regexp_replace( _tbl::text, '"', '', 'g' ) );

我将其用作解决方法,因为这似乎不是正确的方法

答案 1 :(得分:0)

您的第一个错误是创建一个名称为check(即reserved keyword)的表。

create table check( id int primary key);
ERROR:  syntax error at or near "check"
LINE 1: create table check( id int primary key);

您或其他人必须通过引用它来绕开它。

create table "check"( id int primary key);

因此,它将创建一个名称为"check_pkey"的主键约束。

您从regclass删除引号的方法听起来不像是一种适当的解决方案,而是一种解决方法。

由于您需要regclass的文本表示形式,因此您只需查询pg_class

create or replace function make_bi_temporal( _tbl regclass )
returns void as $$
declare
 l_relname pg_class.relname%type;
BEGIN
   select relname||'_pkey' into l_relname from pg_class where oid = $1;
   execute format( 'alter table %s drop constraint if exists %s',$1,l_relname);
END $$ language plpgsql;   

DEMO