Postgresql:数组(json行)和输入数组之间的欧几里德距离

Postgresql:数组(json行)和输入数组之间的欧几里德距离,postgresql,distance,Postgresql,Distance,以下是我的数据库结构: 我的数据库postgres中的字段数据json例如: {“field1”:[1,2,3,4],“field2”:“toto”} 我有另一个数组 数组_比较=[5,6,7,8] 这里我想做的是:使用以下公式从data->field1(数组)和array\u compare返回一个浮点: 总和((数据->字段1-数组比较)^2))^(1/2) 我试过做很多事情,但我没有做到。 事实上,这是一种计算数组(在JSON中,我想需要强制转换)和输入数组之间欧几里德距离的方法 因此,应

以下是我的数据库结构:

我的数据库postgres中的字段数据json例如:

{“field1”:[1,2,3,4],“field2”:“toto”} 我有另一个数组

数组_比较=[5,6,7,8] 这里我想做的是:使用以下公式从data->field1(数组)和array\u compare返回一个浮点:

总和((数据->字段1-数组比较)^2))^(1/2) 我试过做很多事情,但我没有做到。 事实上,这是一种计算数组(在JSON中,我想需要强制转换)和输入数组之间欧几里德距离的方法


因此,应该使用postgres中的
unnest
函数来获得一个表格,然后在其中应用计算,请参见

那么你应该可以做一些类似的事情

SELECT
    unnest(array[1,2,3]) AS unnest_1,
    unnest(array['a','b','c']) AS unnest_2;
会产生

 unnest_1 | unnest_2 
----------+----------
        1 | a
        2 | b
        3 | c
(3 ROWS)
(示例取自)。
然后,您可以使用常规SQL获取差异并将其相加。

您可能正在寻找“结果以并行列返回”的结果。对于JSON数组,您将使用它;对于普通数组,您将使用
unest

SELECT id, (
  SELECT sum(sqrt(x^2 - y::numeric^2)) -- try `array_agg(x || ' ' || y)` for debugging
  FROM ROWS FROM (
    unnest(ARRAY[5, 6, 7, 8]),
    json_array_elements_text(json->'field1')
  ) as r(x, y)
) as distance
FROM example

()

如果您有两个数组,那么使用
unnest(array1,array2)
可能很简单,对吧,我没有看到您链接了一篇文章,详细解释了这一切(并且声明多参数
unnest
是9.4的特性)!但鉴于OP没有说明他使用的版本,我认为这无关紧要
SELECT id, (
  SELECT sum(sqrt(x^2 - y::numeric^2)) -- try `array_agg(x || ' ' || y)` for debugging
  FROM ROWS FROM (
    unnest(ARRAY[5, 6, 7, 8]),
    json_array_elements_text(json->'field1')
  ) as r(x, y)
) as distance
FROM example