सामान्यतया आप जावा या स्काला में लिखे गए संग्रहीत फ़ंक्शन का उपयोग करके इस प्रकार की समस्याओं को हल कर सकते हैं (कुछ पीएल/एसक्यूएल, सी या सी ++ पसंद कर सकते हैं)।
PostgreSql (जावा आधारित) संग्रहीत कार्यों का समर्थन करता है, इसलिए SQL क्वेरी को डेटा लाने दें, और इसे एक संग्रहीत फ़ंक्शन में पास करें। संग्रहीत फ़ंक्शन दूरी लौटाता है, ताकि आप उस पर फ़िल्टर/सॉर्ट आदि कर सकें।
इस तरह की तालिका के आधार पर
create table point(vector float8[]);
insert into point values('{0.0, 0.0, 0.0}');
insert into point values('{0.5, 0.5, 0.5}');
जावा फ़ंक्शन के साथ इस तरह:
public class PlJava {
public final static double distance2(double[] v1, double[] v2) {
return Math.sqrt(Math.pow(v2[0] - v1[0], 2)
+ Math.pow(v2[1] - v1[1], 2) + Math.pow(v2[2] - v1[2], 2));
}
}
और SQL में फंक्शन डिक्लेरेशन:
CREATE FUNCTION pljava.distance2(float8[], float8[])
RETURNS float8
AS 'PlJava.distance2'
IMMUTABLE
LANGUAGE java;
आपकी क्वेरी कुछ इस तरह दिख सकती है:
select
point.*,
pljava.distance2(vector, '{1.0, 1.0, 1.0}') as dist
from
point
order by
dist;
जिसके परिणामस्वरूप
vector | dist
---------------+-------------------
{0.5,0.5,0.5} | 0.866025403784439
{0,0,0} | 1.73205080756888
अपडेट करें
संग्रहीत कार्यों को सी और सी ++ में भी लिखा जा सकता है। C++ को अधिक प्रयास की आवश्यकता है, क्योंकि PostgreSql का इंटरफ़ेस C कॉलिंग कन्वेंशन का उपयोग कर रहा है। देखें एक्सटेंसिबिलिटी के लिए C++ का उपयोग करना