动态SQL(EXECUTE)作为IF语句的条件

问题描述 投票:0回答:3

我想执行一条动态 SQL 语句,其返回值是

IF
语句的条件:

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN

这会产生错误

ERROR:  type "execute" does not exist

是否可以这样做,或者是否需要将IF语句之前的SQL执行到变量中,然后检查该变量作为条件?

postgresql dynamic-sql plpgsql
3个回答
29
投票

这种构造是不可能的:

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
直接从动态查询中获取结果。我引用手册在这里

如果提供了行或变量列表,它必须与 查询结果的结构(当使用记录变量时,它 将配置自身以自动匹配结果结构)。如果 返回多行,只有第一行会被分配给

INTO
变量。如果没有返回行,则将 NULL 分配给
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 ...

9
投票

马特,

从上面的语法来看,您正在编写 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”是一个特殊变量,用于检查上次运行的查询是否返回任何行。


-3
投票
SET @SQLQUERY='SELECT 1 FROM mytable'

EXEC (@SQLQUERY)
If @@RowCount >0  THEN
© www.soinside.com 2019 - 2024. All rights reserved.