支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

41.4. 表達式 #

所有在 PL/pgSQL 語句中使用的表達式都使用伺服器的主要SQL執行器來處理。例如,當您編寫像這樣的 PL/pgSQL 語句時

IF expression THEN ...

PL/pgSQL 將透過提供像這樣的查詢來評估表達式

SELECT expression

到主 SQL 引擎。在形成 SELECT 命令時,任何出現的 PL/pgSQL 變數名稱都會被查詢參數取代,如第 41.11.1 節中所詳述。這允許 SELECT 的查詢計畫僅準備一次,然後重複用於後續的變數不同值的評估。因此,第一次使用表達式時,實際發生的事情本質上是一個 PREPARE 命令。例如,如果我們宣告了兩個整數變數 xy,並且我們寫了

IF x < y THEN ...

幕後發生的事情相當於

PREPARE statement_name(integer, integer) AS SELECT $1 < $2;

然後對於每次執行 IF 語句,這個預備語句都會被 EXECUTE,並將 PL/pgSQL 變數的當前值作為參數值提供。通常這些細節對於 PL/pgSQL 使用者來說並不重要,但在嘗試診斷問題時了解它們很有用。更多資訊請參閱第 41.11.2 節

由於 expression 被轉換為 SELECT 命令,它可以包含與普通 SELECT 相同的子句,但它不能包含頂層的 UNIONINTERSECTEXCEPT 子句。因此,例如,可以測試一個表是否為非空,如下所示:

IF count(*) > 0 FROM my_table THEN ...

因為 IFTHEN 之間的 expression 被解析為好像它是 SELECT count(*) > 0 FROM my_tableSELECT 必須產生單個欄位,且不能超過一行。(如果它沒有產生任何行,則結果被視為 NULL。)

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來報告文件問題。