Postgresql 将表名创建为连接字符串

Postgresql 将表名创建为连接字符串,postgresql,string-concatenation,amazon-redshift,create-table,Postgresql,String Concatenation,Amazon Redshift,Create Table,我正在通过SQL工作台使用Amazon Redshift。 我需要创建一个表(实际上是多个但…babysteps),其名称是通过连接两个字符串来构造的 以下声明有效: CREATE TABLE "public.user_111111" ( user_id int, event_id int, ) 但下面的一个没有: CREATE TABLE "public."||"user_111112" ( user_id int, event_id int, ) 错误是: [Amazon](500310

我正在通过SQL工作台使用Amazon Redshift。 我需要创建一个表(实际上是多个但…babysteps),其名称是通过连接两个字符串来构造的

以下声明有效:

CREATE TABLE "public.user_111111" (
user_id int,
event_id int,
)
但下面的一个没有:

CREATE TABLE "public."||"user_111112" (
user_id int,
event_id int,
)
错误是:

[Amazon](500310) Invalid operation: syntax error at or near "||";
你能帮我理解我在第二次陈述中做错了什么吗


谢谢

正如lad2025所建议的,您可以使用动态SQL来实现这一点

然而 在表名中加点是个糟糕的主意。已在DBA网站上询问:

引述

多年来,我发现很多人在理解上有困难 由四部分组成的命名约定,尽管看起来很明显:

server_name.database_name.schema_name.object_name
想象一下,如果他们看到这样的事情会发生什么:

MAIN-SQL.[MyApp.Sales].hr.CompetitorsProducts
DO
$$
DECLARE 
  vSQL      TEXT;
  vMYSCHEMA TEXT;
  vMYTABLE  TEXT;
BEGIN
    vMYSCHEMA = 'public';
    vMYTABLE  = 'user_111112';

    vSQL = 'CREATE TABLE ' || vMYSCHEMA || '.' || vMYTABLE || ' (user_id int, event_id int)';
    EXECUTE vSQL;

END;
$$
;
或:

保持事物简单是很重要的


我建议你也不要在桌子上画点。这样做会让你自己(或其他人)的生活变得更加艰难。

正如lad2025所建议的,你可以使用动态SQL来做到这一点

然而 在表名中加点是个糟糕的主意。已在DBA网站上询问:

引述

多年来,我发现很多人在理解上有困难 由四部分组成的命名约定,尽管看起来很明显:

server_name.database_name.schema_name.object_name
想象一下,如果他们看到这样的事情会发生什么:

MAIN-SQL.[MyApp.Sales].hr.CompetitorsProducts
DO
$$
DECLARE 
  vSQL      TEXT;
  vMYSCHEMA TEXT;
  vMYTABLE  TEXT;
BEGIN
    vMYSCHEMA = 'public';
    vMYTABLE  = 'user_111112';

    vSQL = 'CREATE TABLE ' || vMYSCHEMA || '.' || vMYTABLE || ' (user_id int, event_id int)';
    EXECUTE vSQL;

END;
$$
;
或:

保持事物简单是很重要的


我建议你也不要在桌子上画点。这样做会使你自己(或其他人)的生活变得更加坚强。

使用
execute
命令(动态sql):

就像这样简单:

MAIN-SQL.[MyApp.Sales].hr.CompetitorsProducts
DO
$$
DECLARE 
  vSQL      TEXT;
  vMYSCHEMA TEXT;
  vMYTABLE  TEXT;
BEGIN
    vMYSCHEMA = 'public';
    vMYTABLE  = 'user_111112';

    vSQL = 'CREATE TABLE ' || vMYSCHEMA || '.' || vMYTABLE || ' (user_id int, event_id int)';
    EXECUTE vSQL;

END;
$$
;


使用
执行
命令(动态sql):

就像这样简单:

MAIN-SQL.[MyApp.Sales].hr.CompetitorsProducts
DO
$$
DECLARE 
  vSQL      TEXT;
  vMYSCHEMA TEXT;
  vMYTABLE  TEXT;
BEGIN
    vMYSCHEMA = 'public';
    vMYTABLE  = 'user_111112';

    vSQL = 'CREATE TABLE ' || vMYSCHEMA || '.' || vMYTABLE || ' (user_id int, event_id int)';
    EXECUTE vSQL;

END;
$$
;


您需要动态sql。标识符必须在编译时已知。标识符应该是
literal
是“public”。| | |“user_111112”
是表达式。Amazon Redshift支持动态SQL吗?您需要动态SQL。标识符必须在编译时已知。标识符应该是
literal
,但
应该是“public”。| |“user_u111112”
是表达式。Amazon Redshift支持动态SQL吗?我想尝试的是在“public”模式内创建一个表。因此,创建表public.mytable就可以了。我一直认为,如果引用某个对象,它就可以作为一个独立的对象。我可能是错的,虽然我试图在公共模式中添加表,但表的名称不包含点,它应该是“user111112”,我想我要做的是在“public”模式中创建一个表。因此,创建表public.mytable就可以了。我一直认为,如果引用某个对象,它就可以作为一个独立的对象。虽然我试图在公共模式中添加表,但我可能是错的,表的名称不包含点,它应该是“user111112”,这两种解决方案都会导致:[Amazon](500310)无效操作:在“DO”处或附近出现语法错误;我不确定Amazon Redshift是否支持此语法。两种解决方案都会导致:[Amazon](500310)无效操作:在“DO”处或附近出现语法错误;我不确定Amazon Redshift是否支持这种语法。