我通过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 "||";
请你帮我理解我在第二次陈述中做错了什么?
谢谢
答案 0 :(得分:1)
正如lad2025建议的那样,你可以使用动态SQL 来做到这一点。
将DOTS放入表名中这是一个糟糕的主意。有人问过DBA网站:Is it okay to put dots in SQL Server database names?
引用答案多年来我发现很多人都难以理解 即使看起来非常明显,这个四部分的命名约定:
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;
$$
;