2012-11-11 44 views
-2

以下postgresql存儲過程的目的是什麼,它在執行查詢時使用,謝謝!以下postgresql存儲過程的目的是什麼

CREATE OR REPLACE FUNCTION extract_fp_query(int[]) RETURNS int[] 
AS $$ 
    SELECT uniq(sort(subarray($1 - 627964279, 
     greatest(0, least(icount($1 - 627964279) - 120, 80)), 120))); 
$$ LANGUAGE 'SQL' IMMUTABLE STRICT; 
+3

通過閱讀'uniq','sort','subarray','''''''''''''''PostgreSQL]最大','最小'和'icount'功能。當你對這些問題有特定的問題時,人們可以幫助你。 –

+1

@JonathanLeffler:我不知道這是否會使問題變得更好或更糟,但是:在PostgreSQL手冊中解釋了AFAIK中只有'最大'和'最少'的解釋。 'uniq','sort','subarray'和'icount'必須是其他用戶提供的函數。 –

+1

@ A.H .:如果它們是非標準函數,那麼任何不能訪問用戶提供的函數的人都無法回答這個問題。然而,我在PostgreSQL手冊中發現了一些材料:['sort','icount','subarray'和'uniq'](http://www.postgresql.org/docs/9.2/static/intarray.html) 。 –

回答

0

此代碼在很大程度上依賴於the intarray extension中的功能。一旦你知道你可以通過將其分解成幾個步驟來解決它。

它在我看來就像某種窮人的加密或模糊程序,但是你沒有提供任何有關它的輸入的信息,所以很難說更多。本質上它返回一個已排序的,重複數組的子集,根據數組中元素的數量決定返回哪個子集。如果我正確讀取它,它會從數組中刪除值627964279,然後根據數組中元素的數量將120個元素(在重複數據刪除之前)從0和80個元素的偏移量返回到數組中。

創建測試數據庫。我會打電話給我的regress。創建它和intarray的contrib模塊安裝到它作爲一個超級用戶:

sudo -u postgres createdb -O myusername regress 
sudo -u postgres psql regress -c 'CREATE EXTENSION intarray;' 

現在,作爲myusername運行,無論你unpriveleged的用戶帳戶,下破碼成的步驟,並嘗試每一步。就像你會在C.它可能有助於其格式化爲表達式:

SELECT uniq(sort(
    subarray(
     $1 - 627964279, 
     greatest(
      0, 
      least(
       icount($1 - 627964279) - 120, 
       80 
      ) 
     ) 
     , 120 
    ) 
)); 

然後評估通過手中的每個子表達式與已知輸入,當您去替代結果和簡化的表達,同時記下什麼確實。我不能爲你做,因爲你沒有提供的樣品輸入,但是,隨着您的輸入數組替換ARRAY[42,5,9,24,1,627964279]你會做這樣的事情:

$ psql regress 
psql (9.2.1) 
Type "help" for help. 

regress=> SELECT ARRAY[42,5,9,24,1,627964279]; 
      array   
------------------------- 
{42,5,9,24,1,627964279} 
(1 row) 

regress=> SELECT ARRAY[42,5,9,24,1,627964279] - 627964279; 
    ?column?  
--------------- 
{42,5,9,24,1} 
(1 row) 

regress=> SELECT icount(ARRAY[42,5,9,24,1,627964279] - 627964279); 
icount 
-------- 
     5 
(1 row) 

regress=> SELECT least(icount(ARRAY[42,5,9,24,1,627964279] - 627964279),80); 
least 
------- 
    5 
(1 row) 

regress=> 
regress=> SELECT greatest(least(icount(ARRAY[42,5,9,24,1,627964279] - 627964279),80),0); 
greatest 
---------- 
     5 
(1 row) 

現在,通過代5的表達greatest(...)成在subarray表達我們得到:

SELECT subarray($1 - 627964279, 5, 120) 

這是數組項去除後評價:

regress=> SELECT subarray(ARRAY[42,5,9,24,1], 5, 120); 
subarray 
---------- 
{1} 
(1 row) 

在這種情況下,sortuniq不起作用。

這是幹什麼用的?誰知道,因爲你還沒有提供可能提供線索的輸入數組。

請參閱the intarray documentation

相關問題