第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在PostgreSQL中的函數(shù)內(nèi)返回SELECT的結(jié)果?

如何在PostgreSQL中的函數(shù)內(nèi)返回SELECT的結(jié)果?

揚(yáng)帆大魚 2019-11-27 14:13:56
我在PostgreSQL中有此功能,但是我不知道如何返回查詢結(jié)果:CREATE OR REPLACE FUNCTION wordFrequency(maxTokens INTEGER)  RETURNS SETOF RECORD AS$$BEGIN    SELECT text, count(*), 100 / maxTokens * count(*)    FROM (        SELECT text    FROM token    WHERE chartype = 'ALPHABETIC'    LIMIT maxTokens    ) as tokens    GROUP BY text    ORDER BY count DESCEND$$LANGUAGE plpgsql;但是我不知道如何在PostgreSQL函數(shù)中返回查詢結(jié)果。我發(fā)現(xiàn)返回類型應(yīng)該為SETOF RECORD,對嗎?但是return命令不正確。什么是正確的方法?
查看完整描述

2 回答

?
千巷貓影

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個贊

用途RETURN QUERY:


CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int)

  RETURNS TABLE (txt   text   -- also visible as OUT parameter inside function

               , cnt   bigint

               , ratio bigint) AS

$func$

BEGIN

   RETURN QUERY

   SELECT t.txt

        , count(*) AS cnt                 -- column alias only visible inside

        , (count(*) * 100) / _max_tokens  -- I added brackets

   FROM  (

      SELECT t.txt

      FROM   token t

      WHERE  t.chartype = 'ALPHABETIC'

      LIMIT  _max_tokens

      ) t

   GROUP  BY t.txt

   ORDER  BY cnt DESC;                    -- potential ambiguity 

END

$func$  LANGUAGE plpgsql;

呼叫:


SELECT * FROM word_frequency(123);

說明:


這是很多更實(shí)用的明確定義的返回類型不是簡單地聲明為記錄。這樣,您不必在每次函數(shù)調(diào)用時都提供列定義列表。RETURNS TABLE是做到這一點(diǎn)的一種方法。還有其他 OUT參數(shù)的數(shù)據(jù)類型必須與查詢返回的內(nèi)容完全匹配。


OUT仔細(xì)選擇參數(shù)名稱。它們在功能主體中幾乎任何位置都可見。對具有相同名稱的列進(jìn)行表限定,以避免沖突或意外結(jié)果。我在示例中對所有列進(jìn)行了此操作。


但是請注意,參數(shù)和同名列別名之間可能存在命名沖突。在這種特殊情況下(),Postgres會以兩種方式在參數(shù)上使用列別名。但是,在其他情況下,這可能是模棱兩可的。有多種避免混淆的方法:OUTcntRETURN QUERY SELECT ...OUT


使用項(xiàng)目在SELECT列表中的順序位置:ORDER BY 2 DESC。例:

在每個GROUP BY組中選擇第一行?

重復(fù)表達(dá)式ORDER BY count(*)。

(此處不適用。)設(shè)置配置參數(shù)plpgsql.variable_conflict或#variable_conflict error | use_variable | use_column在功能中使用特殊命令??吹剑?/p>

使用USING子句命名函數(shù)參數(shù)和JOIN結(jié)果之間的沖突

請勿使用“文本”或“計(jì)數(shù)”作為列名。兩者在Postgres中都是合法使用的,但是“ count”是標(biāo)準(zhǔn)SQL中的保留字,并且是基本函數(shù)名稱,而“ text”是基本數(shù)據(jù)類型。可能導(dǎo)致混亂的錯誤。我在示例中使用txt和cnt。


添加了缺少的內(nèi)容,;并糾正了標(biāo)頭中的語法錯誤。(_max_tokens int)不(int maxTokens)- 鍵入后的名稱。


使用整數(shù)除法時,最好先相乘然后再相除,以最大程度地減少舍入誤差。甚至更好:使用numeric(或浮點(diǎn)類型)。見下文。


另類

我認(rèn)為您的查詢實(shí)際上應(yīng)該是這樣的(計(jì)算每個令牌的相對份額):


CREATE OR REPLACE FUNCTION word_frequency(_max_tokens int)

  RETURNS TABLE (txt            text

               , abs_cnt        bigint

               , relative_share numeric) AS

$func$

BEGIN

   RETURN QUERY

   SELECT t.txt, t.cnt

        , round((t.cnt * 100) / (sum(t.cnt) OVER ()), 2)  -- AS relative_share

   FROM  (

      SELECT t.txt, count(*) AS cnt

      FROM   token t

      WHERE  t.chartype = 'ALPHABETIC'

      GROUP  BY t.txt

      ORDER  BY cnt DESC

      LIMIT  _max_tokens

      ) t

   ORDER  BY t.cnt DESC;

END

$func$  LANGUAGE plpgsql;

該表達(dá)式sum(t.cnt) OVER ()是一個窗口函數(shù)。您可以使用CTE代替子查詢-漂亮,但是在這種簡單情況下,子查詢通常更便宜。


最后明確RETURN聲明不要求有工作的時候(但允許)OUT參數(shù)或RETURNS TABLE(使隱式使用的OUT參數(shù))。


round()具有兩個參數(shù)的參數(shù)僅適用于numeric類型。count()子查詢產(chǎn)生bigint的結(jié)果和sum()在此bigint產(chǎn)生numeric的結(jié)果,因此,我們對付numeric自動編號和一切都只是屬于地方。


查看完整回答
反對 回復(fù) 2019-11-27
  • 2 回答
  • 0 關(guān)注
  • 1874 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號