我在PostgreSQL 8.3中有一个简单的SQL查询,可以获取一堆注释.我在子句中为构造提供了一个值的排序列表:INWHERE
SELECT * FROM comments WHERE (comments.id IN (1,3,2,4));
Run Code Online (Sandbox Code Playgroud)
这将以任意顺序返回注释,在我碰巧是ids之类的1,2,3,4.
我希望结果行像IN构造中的列表一样排序:(1,3,2,4).
怎么实现呢?
这是我想要做的总结:
$array[0] = 1;
$array[1] = 2;
$sql = "SELECT * FROM table WHERE some_id = $array"
Run Code Online (Sandbox Code Playgroud)
显然有一些语法问题,但这就是我想要做的,而且我还没有发现任何显示如何做的事情.
目前,我的计划是按照以下方式做点什么:
foreach($idList as $is)
$where .= 'some_id=' . $id . ' OR';
endforeach
$sql = "SELECT * FROM table WHERE " . $where;
Run Code Online (Sandbox Code Playgroud)
那么PostgreSQL中是否支持使用数组进行搜索,或者我是否必须执行与我的解决方案类似的操作?
好的,有一些关于如何做到这一点的答案.但所有答案都假设查询选择了全部.如果您有明确的选择,则方法不再有效.
请参阅此处了解该方法:在Postgresql中模拟MySQL的ORDER BY FIELD()
基本上我有
SELECT DISTINCT id
FROM items
WHERE id IN (5,2,9)
ORDER BY
CASE id
WHEN 5 THEN 1
WHEN 2 THEN 2
WHEN 9 THEN 3
END
Run Code Online (Sandbox Code Playgroud)
当然,这打破并说
"PGError:错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中"
有没有办法按照IN子句中的值的顺序在PostgreSQL中排序查询结果?
select osmid,ST_X(shape),ST_Y(shape)
from osmpoints
where (osmpoints.osmid, osmpoints.osmtimestamp)
IN (select osmid,MAX(osmtimestamp)
from osmPoints
GROUP BY osmid
Having MAX(osmtimestamp) <= '2019-09-16T01:23:55Z'
AND osmid in ('4426786454','1861591896','1861591869','1861591895',
'4426786455','2038185115','1861591853','6797739995',
'2299605892','6797739994','1861591898','2038185111','4426786454'));
Run Code Online (Sandbox Code Playgroud)
当我运行这个查询时,我得到基于 osmid 列的排序行。但我的问题是如何按在 IN 子句中使用的 osmid 的顺序获取行?