我正在尝试根据一组用户的 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。这似乎应该可以在一次调用中完成,但我似乎无法弄清楚语法。任何建议将不胜感激。
不幸的是,= 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_id在donedeals表中是唯一的,另一种选择是将id左侧的“转换”为数组,然后使用“包含于”运算符<@::
SELECT latitude, longitude
FROM userloc
WHERE array[id] <@ (SELECT interested
FROM donedeals
WHERE deals_id=64 );
Run Code Online (Sandbox Code Playgroud)
不确定哪个会更快。您将需要检查执行计划。
| 归档时间: |
|
| 查看次数: |
16407 次 |
| 最近记录: |