我想执行一个动态SQL语句,其返回值是IF
语句的条件:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN
这会生成错误ERROR: type "execute" does not exist
。
是否可以这样做,或者是否有必要在IF语句之前执行SQL变量,然后将变量检查为条件?
答案 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
clause和EXECUTE
来获取动态结果直接查询。我引用手册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