以下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;
答案 0 :(得分:0)
此代码在很大程度上依赖于the intarray
extension中的功能。一旦你知道你可以把它分解成步骤来解决它。
在我看来,我喜欢某种穷人的加密或混淆程序,但你没有提供有关其输入的任何信息,所以很难说更多。本质上,它返回传递数组的已排序,重复数据删除的子集,根据数组中的元素数决定返回哪个子集。如果我正确读取它会从数组中删除值627964279(如果它出现在那里),然后根据数组中元素的数量,将0和80个元素的偏移量返回120个元素(在重复数据删除之前)。 / p>
创建测试数据库。我会打电话给我regress
。创建它并以超级用户身份将intarray
contrib模块安装到其中:
sudo -u postgres createdb -O myusername regress
sudo -u postgres psql regress -c 'CREATE EXTENSION intarray;'
现在以myusername
运行,无论您的未成熟用户帐户是什么,请将代码分解为步骤并尝试每一步。就像在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
没有进一步的效果。
它的用途是什么?谁知道,因为你没有提供可能提供线索的输入数组。