【发布时间】:2021-12-02 10:36:04
【问题描述】:
我正在构建一个动态 SQL 语句,类似于
my_interval_var := interval - '60 days';
sql_query := format($f$ AND NOT EXISTS (SELECT 1 FROM some_table st WHERE st.%s = %s.id AND st.expired_date >= %L )$f$, var1, var2, now() - my_interval_var)
- 关于我的第一个问题,它似乎在
now() - my_interval_var计算之后正确(似乎)插入了时间戳。但是,我只是想确保我不需要强制转换任何东西,因为我可以让它工作的唯一方法是如果我使用%L,它是字符串文字标识符。或者 postgres 是否允许直接与表示时间的字符串进行比较而无需强制转换?比如
some_column <= '2021-12-31 00:00:00'; // is ::timestamp cast needed?
- 其次,关于我将 SQL 字符串连接到上面的
sql_query变量,我实际上想跳过我所做的格式,并将这个sql_query变量直接注入到 EXECUTE...FORMAT ...USING 语句。
我无法让它工作,但是像这样:
EXECUTE format($f$ SELECT *
FROM %I tbl_alias
WHERE tbl_alias.%s = %L
%s ) USING var1, var2, var3, sql_query;
是否可以将动态 SQL 标识符 %I %L 和 %s 留在变量中,并在 EXECUTE... 级别对其进行格式化?有人告诉我这是不可能的,但这真的很酷。
- 也是我不想添加的最后一个问题,但我觉得有人可能会快速回答。 我用的是]
FOR temprecord IN
SELECT myCol1, myCol2, myCol3
FROM %I tbl',var1)
LOOP
EXECUTE temprecord.someColumnOnMyTbl;
END LOOP;
...但是当我使查询动态化时,我无法让EXECUTE temprecord.someColumnOnMyTbl 语句工作。我尝试了所有标识符,使用 FORMAT,USING...
我认为列是 %s 之类的字符串,因为我一直对列使用类似 alias.%s = 'some string literal' 的别名时这样做
无论如何,我无法让它工作,我想使列名动态化,但尝试了所有这些方法
EXECUTE format($f$ %I.%s $f$, var1, var2);
EXECUTE format($f$ %$1.%$2 $f$) USING var1, var2;
EXECUTE format($f$ %I.someColumnOn%s $f$, var1, var2);
EXECUTE format($f$ $1.someColumnOn$2 $f$) USING var1, var2;
无论如何,我尝试了更多的东西,但是当我将 temprecord 变量设置为 %I 时,我实际上从数据库中获取了一些数据,但我选择了 3 列,看起来有些东西被第二列抬高了标识符,因为我得到了一个 syntax error,它看起来像是试图连接查询结果的所有 3 列...
我确实尝试过对其进行硬编码并且效果很好...任何帮助表示赞赏!
【问题讨论】:
标签: postgresql plpgsql dynamic-sql execute