Postgresql

如何根據查詢結果對錶創建註釋

  • June 13, 2019

我想使用查詢結果作為對錶格的評論。我在 psql 中嘗試過:

\set list select count(*) from department.master_data
COMMENT ON TABLE department.master_data IS :list;

但我得到了這個錯誤:

it=> \set list select count(*) from department.master_data
it=> COMMENT ON TABLE department.master_data IS :list;
ERROR:  syntax error at or near "selectcount"
LINE 1: ...ABLE department.master_data IS selectcoun...

雖然我不確定您想要實現什麼(為什麼將計數儲存為評論是有意義的,特別是如果您的表將獲得新行(或失去一些到DELETEs)),但這裡是您的問題是什麼以及如何你可以解決它。

首先,檢查你psql認為變數中有什麼:

\echo :list
selectcount(*)fromdepartment.master_data

顯然不是您查詢的結果。要儲存它,您必須使用\gset

> SELECT count(*) AS master_data_count FROM department.master_data;
master_data_count
───────────────────
       1234567890
(1 row)

> \gset
> \echo :master_data_count
1234567890

如果你現在嘗試設置表描述,你會得到另一個錯誤:

ERROR:  syntax error at or near "1234567890"
LINE 1: ...ABLE department.master_data IS selectcoun...

這是因為註釋必須是(引號分隔的)文本。要從變數中取出一個,您有兩種選擇。psql一種是使用(使用您濫用設置的相同功能)向變數添加轉義引號:list

> \set master_data_count '\'' :master_data_count '\''
> \echo :master_data_count
'1234567890'

或者您可以在查詢中添加已經引用的報價,因此SELECT count(*)變成

SELECT $$'$$ || count(*) || $$'$$

(我在上面使用美元報價來避免輸入類似的東西''''。)

您已經可以將結果用作註釋,因為它包含必要的引號。

在 psql 中使用\gset將查詢結果儲存在局部變數中 - 就像 dezso 已經建議的那樣。更短一點,\gset可以將分號 ( ;) 替換為查詢終止符:

test=# SELECT count(*) AS list FROM department.master_data \gset

然後,要獲得單引號字元串(任何包含的單引號會自動安全轉義),請使用以下語法變體引用 psql 變數::'list'. 注意冒號後面的括起來!''

test=# COMMENT ON TABLE department.master_data IS :'list';

閱讀手冊中的 SQL 插值

有關的:

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