如何在 postgresql 中执行 =ANY(SELECT...query?

Bee*_*eeb 4 postgresql array

我正在尝试根据一组用户的 id 在另一个表中存储的数组中选择他们的所有纬度和经度。这是我的尝试:

SELECT latitude, longitude 
FROM userloc WHERE id = ANY( SELECT interested FROM donedeals WHERE deals_id=67);
Run Code Online (Sandbox Code Playgroud)

但它给了我以下错误:

ERROR:  operator does not exist: integer = integer[]
LINE 1: SELECT latitude, longitude FROM userloc WHERE id = ANY( SELE...
                                                         ^
HINT:  No operator matches the given name and argument type(s).
       You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)

donedeals有一int列 fordeals_id和一int array列 for interested,其中包含与 的 id 列对应的 id userloc,该列存储纬度和经度:

 deals_id |  interested   
----------+---------------
       67 | {377,387,376}
       64 | {381,384}
       66 | {377,387}

  latitude  |  longitude  | id  
------------+-------------+-----
 40.6439417 |  -73.964927 | 384
 40.7554919 |  -73.925891 | 380
 40.6434067 | -73.9657654 | 385
  40.746452 |   -73.90732 | 378
  40.643459 |  -73.964586 | 381
 40.6430341 | -73.9656954 | 382
Run Code Online (Sandbox Code Playgroud)

这一切都在 Postgres 9.3.5 中。

我想选择与给定interested数组对应的 id 的所有纬度和经度deals_id。这似乎应该可以在一次调用中完成,但我似乎无法弄清楚语法。任何建议将不胜感激。

a_h*_*ame 8

不幸的是,= ANY (array)只适用于右侧的数组文字,而不是子选择。

您需要使用以下命令“规范化”非规范化模型unnest()

SELECT latitude, longitude 
FROM userloc 
WHERE id IN (SELECT unnest(interested) 
             FROM donedeals 
             WHERE deals_id = 64);
Run Code Online (Sandbox Code Playgroud)

如果deals_iddonedeals表中是唯一的,另一种选择是将id左侧的“转换”为数组,然后使用“包含于”运算符<@::

SELECT latitude, longitude 
FROM userloc 
WHERE array[id] <@ (SELECT interested 
                    FROM donedeals 
                    WHERE deals_id=64 );
Run Code Online (Sandbox Code Playgroud)

不确定哪个会更快。您将需要检查执行计划。