2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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 會透過向主 SQL 引擎提供類似以下的查詢來評估表示式:

SELECT expression

在構造 SELECT 命令時,PL/pgSQL 變數名的任何出現都會被替換為查詢引數,這在第 41.11.1 節中有詳細討論。這使得 SELECT 的查詢計劃可以只准備一次,然後在後續的表示式計算中使用不同的變數值重複使用。因此,在表示式首次使用時實際發生的事情本質上是一個 PREPARE 命令。例如,如果我們聲明瞭兩個整數變數 xy,並且我們寫了

IF x < y THEN ...

幕後發生的事情等同於

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

然後,對於每次執行 IF 語句,都會執行此準備好的語句,並將 PL/pgSQL 變數的當前值作為引數值提供。通常,這些細節對於 PL/pgSQL 使用者來說並不重要,但瞭解它們有助於診斷問題。更多資訊請參閱第 41.11.2 節

由於一個 表示式 被轉換為一個 SELECT 命令,它可以包含普通 SELECT 中的相同子句,只是它不能包含頂層的 UNIONINTERSECTEXCEPT 子句。因此,例如,你可以使用以下方法測試一個表是否非空:

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

因為 IFTHEN 之間的 表示式 被解析為 SELECT count(*) > 0 FROM my_table。該 SELECT 必須產生單列,並且不超過一行。(如果它不產生行,則結果被視為 NULL。)

提交更正

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