此代碼在很大程度上依賴於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)
在這種情況下,sort
和uniq
不起作用。
這是幹什麼用的?誰知道,因爲你還沒有提供可能提供線索的輸入數組。
請參閱the intarray documentation。
通過閱讀'uniq','sort','subarray','''''''''''''''PostgreSQL]最大','最小'和'icount'功能。當你對這些問題有特定的問題時,人們可以幫助你。 –
@JonathanLeffler:我不知道這是否會使問題變得更好或更糟,但是:在PostgreSQL手冊中解釋了AFAIK中只有'最大'和'最少'的解釋。 'uniq','sort','subarray'和'icount'必須是其他用戶提供的函數。 –
@ A.H .:如果它們是非標準函數,那麼任何不能訪問用戶提供的函數的人都無法回答這個問題。然而,我在PostgreSQL手冊中發現了一些材料:['sort','icount','subarray'和'uniq'](http://www.postgresql.org/docs/9.2/static/intarray.html) 。 –