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

时间:2011-12-09 17:01:25

标签: postgresql dynamic-sql plpgsql

我想执行一个动态SQL语句,其返回值是IF语句的条件:

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

这会生成错误ERROR: type "execute" does not exist

是否可以这样做,或者是否有必要在IF语句之前执行SQL变量,然后将变量检查为条件?

3 个答案:

答案 0 :(得分:20)

这种结构是不可能的:

<击> IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...

您可以简化为:

IF EXISTS (SELECT 1 FROM mytable) THEN ...

但你的例子可能只是简化了。对于使用 EXECUTE read the manual here执行的 动态SQL 。您可以在FOUND之后检查 RETURN QUERY EXECUTE

IF FOUND THEN ...

然而:

  

请特别注意,EXECUTE会更改 GET DIAGNOSTICS 的输出,但不会更改FOUND

大胆强调我的。对于普通EXECUTE,请执行此操作:

...
DECLARE
   i int;
BEGIN
   EXECUTE 'SELECT 1 FROM mytable';

   GET DIAGNOSTICS i = ROW_COUNT;

   IF i > 0 THEN ...

如果适当的话 - 特别是只有单行结果 - 使用INTO clauseEXECUTE来获取动态结果直接查询。我引用手册here

  

如果提供了行或变量列表,则它必须与   查询结果的结构(当使用记录变量时,它   将自己配置为自动匹配结果结构)。如果   返回多行,只会将第一行分配给   INTO变量。如果没有返回任何行,则为INTO分配NULL   变量(多个)。

...
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 ...

答案 1 :(得分:7)

马特,

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

答案 2 :(得分:-3)

SET @SQLQUERY='SELECT 1 FROM mytable'

EXEC (@SQLQUERY)
If @@RowCount >0  THEN