Postgresql

PL/pgSQL 函式中何時需要 SELECT?

  • April 15, 2019

在 PL/pgSQL 中將函式或表達式的結果分配給變數時,什麼時候需要使用SELECT語句(子查詢)?

這可能只是我對 SQL 的誤解。我認為一切都應該包含在一個(SELECT ...)(即使它只是涉及計算一個數字),例如

$$
DECLARE parts text[];
BEGIN
 parts := (SELECT string_to_array(my_str,'_') );
...
$$

但我只是發現它沒有SELECT

parts := string_to_array(my_str,'_');

(就好像我可以像使用 Pascal 一樣使用 PL/pgSQL。)

一般來說,什麼樣的表達式可以直接使用而不SELECT計算值

這只是一個有根據的猜測。

似乎SELECT是不必要的,因為它已經存在,例如在隱含SELECT ... INTO的賦值:=等價於。從文件中

一個 PL/pgSQL 變數的賦值寫成:

變數 { := | = } 表達式;

如前所述,此類語句中的表達式是通過發送到主數據庫引擎的 SQL SELECT 命令來評估的。

此處可能會顯示一個範例,其中:

name := (SELECT t.name from test_table t where t.id = x);

也可以寫成

name := t.name from test_table t where t.id = x;

這似乎是可能的,因為第二種簡化形式等同SELECT INTO於 PL/pgSQL 中的 a:

SELECT test_table.name INTO name FROM test_table WHERE id = x;

第一種形式相當於:

SELECT (SELECT t.name from test_table t where t.id = x) INTO name;

,其中有一個SELECT可以刪除的冗餘層。

另一方面,當隱式SELECT不存在時,顯式SELECT似乎是必要的。例如,不能直接使用相同的功能(即沒有SELECT

string_to_array(my_str,'_');

如果它不在對變數的賦值中。

引用自:https://dba.stackexchange.com/questions/200319