我想执行一条动态 SQL 语句,其返回值是
IF
语句的条件:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN
这会产生错误
ERROR: type "execute" does not exist
。
是否可以这样做,或者是否需要将IF语句之前的SQL执行到变量中,然后检查该变量作为条件?
这种构造是不可能的:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
您可以简化为:
IF EXISTS (SELECT FROM mytable) THEN ...
但是你的例子可能被简化了。对于使用 EXECUTE
执行的
动态 SQL,请阅读此处的手册。您可以在执行任何 DML 命令后立即检查特殊变量
FOUND
,以查看是否有任何行受到影响:
IF FOUND THEN ...
但是:
特别注意,
更改了EXECUTE
的输出,但不更改GET DIAGNOSTICS
。FOUND
我的粗体强调。对于普通的
EXECUTE
,请改为这样做:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
INTO
子句 和 EXECUTE
直接从动态查询中获取结果。我引用手册在这里:
如果提供了行或变量列表,它必须与 查询结果的结构(当使用记录变量时,它 将配置自身以自动匹配结果结构)。如果 返回多行,只有第一行会被分配给
变量。如果没有返回行,则将 NULL 分配给INTO
变量。INTO
...
DECLARE
_var1 int; -- init value is NULL unless instructed otherwise
BEGIN
EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
INTO _var1;
IF _var1 IS NOT NULL THEN ...
马特,
从上面的语法来看,您正在编写 PL/pgSQL,而不是 SQL。根据这个假设,有两种方法可以完成您想要的操作,但这两种方法都需要两行代码:
EXECUTE 'SELECT EXISTS (SELECT 1 FROM ' || table_variable || ' );' INTO boolean_var;
IF boolean_var THEN ...
或者:
EXECUTE 'SELECT 1 FROM ' || table_variable || ' );';
IF FOUND THEN ...
“FOUND”是一个特殊变量,用于检查上次运行的查询是否返回任何行。
SET @SQLQUERY='SELECT 1 FROM mytable'
EXEC (@SQLQUERY)
If @@RowCount >0 THEN