2011-12-09 23 views
7

我想執行動態SQL語句,其返回值是有條件爲IF聲明:動態SQL(執行)爲條件IF語句

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

這會產生錯誤ERROR: type "execute" does not exist

是否有可能這樣做,或者是否有必要在IF語句之前執行SQL到變量中,然後檢查變量是否爲條件?

回答

19

此結構是不可能的:

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

可以簡化爲:

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

但是你的例子可能只是簡化。對於動態SQL執行EXECUTE,read the manual here。您可以RETURN QUERY EXECUTE後檢查FOUND

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變量。如果未返回任何行,則將NULL分配給變量(s)的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 ... 
4

馬特,

從上面的語法,你寫的PL/pgSQL裏,而不是SQL。在THT假設,有兩種方法可以做到你想要什麼,但都需要兩行代碼:

EXECUTE 'SELECT EXISTS (SELECT 1 FROM ' || table_variable || ');' INTO boolean_var; 

IF boolean_var THEN ... 

或者:

EXECUTE 'SELECT 1 FROM ' || table_variable || ');'; 

IF FOUND THEN ... 

「發現」是一個特殊的變量,它會檢查,如果最後的查詢運行返回任何行。

+2

你誤會了'FOUND'。它不是由普通的EXECUTE設置的。詳情請參閱我的回答。 –

+0

哈,這就是我快速回答的問題。 –

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

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

這對Postgres無效 –