将表名创建为连续字符串

时间:2015-11-24 16:02:54

标签: postgresql string-concatenation amazon-redshift create-table

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

以下声明有效:

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 "||";

请你帮我理解我在第二次陈述中做错了什么?

谢谢

2 个答案:

答案 0 :(得分:1)

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

无论其

将DOTS放入表名中这是一个糟糕的主意。有人问过DBA网站:Is it okay to put dots in SQL Server database names?

通过Marek Grzenkowicz

引用答案
  

多年来我发现很多人都难以理解   即使看起来非常明显,这个四部分的命名约定:

server_name.database_name.schema_name.object_name
     

想象一下如果他们看到这样的话会发生什么:

MAIN-SQL.[MyApp.Sales].hr.CompetitorsProducts
     

或:

[MAIN-SQL\EXPRESS].[MyApp.Sales].sch_HR.[Products From.Our-Competitors]
     

保持简单非常重要。

我建议不要在你的桌子上放点。你会通过这样做来强化你自己(或其他人)的生活。

答案 1 :(得分:0)

使用execute命令(dynamic-sql):

就像这样简单:

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;
$$
;

DO
$$
BEGIN
    EXECUTE 'CREATE TABLE ' || 'public' || '.' || 'user_111112'|| ' (user_id int, event_id int)';
END;
$$
;