我想執行動態SQL語句,其返回值是有條件爲IF
聲明:動態SQL(執行)爲條件IF語句
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN
這會產生錯誤ERROR: type "execute" does not exist
。
是否有可能這樣做,或者是否有必要在IF語句之前執行SQL到變量中,然後檢查變量是否爲條件?
我想執行動態SQL語句,其返回值是有條件爲IF
聲明:動態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 ...
但是你的例子可能只是簡化。對於動態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
clause與EXECUTE
獲得直接的動態查詢的結果。我引用手動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 ...
馬特,
從上面的語法,你寫的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 ...
「發現」是一個特殊的變量,它會檢查,如果最後的查詢運行返回任何行。
SET @SQLQUERY='SELECT 1 FROM mytable'
EXEC (@SQLQUERY)
If @@RowCount >0 THEN
這對Postgres無效 –
你誤會了'FOUND'。它不是由普通的EXECUTE設置的。詳情請參閱我的回答。 –
哈,這就是我快速回答的問題。 –