簡體   English   中英

動態 SQL (EXECUTE) 作為 IF 語句的條件

[英]Dynamic SQL (EXECUTE) as condition for IF statement

我想執行一個動態 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 1 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 ...

馬特,

根據上面的語法,您正在編寫 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM