Postgresql 将表名创建为连接字符串
我正在通过SQL工作台使用Amazon Redshift。 我需要创建一个表(实际上是多个但…babysteps),其名称是通过连接两个字符串来构造的 以下声明有效: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
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是否支持这种语法。