![](/img/trans.png)
[英]How to execute a dynamic SQL statement in a single Select statement?
[英]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.