Nik*_*dun 3 sql postgresql sql-limit
在PostgreSQL中,我想根据某些条件选择一行,但如果没有符合条件的行,我想返回第一行.该表实际上包含一个序数列,因此任务应该更容易(第一行是序号为0的那一行).例如:
SELECT street, zip, city
FROM address
WHERE street LIKE 'Test%' OR ord = 0
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,没有办法保证匹配的记录的顺序,我没有任何东西可以按顺序排序.使用单个SELECT语句执行此操作的方法是什么?
你走在正确的轨道上.只需添加一个order by:
SELECT street, zip, city
FROM address
WHERE street LIKE 'Test%' OR ord = 0
ORDER BY (CASE WHEN street LIKE 'Test%' THEN 1 ELSE 0 END) DESC
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
或者,或者:
ORDER BY ord DESC
Run Code Online (Sandbox Code Playgroud)
这些中的任何一个都会将该ord = 0行放在最后.
编辑:
Erwin提出了一个很好的观点,从索引使用的角度来看,OR该WHERE条款中的一个并不是最好的方法.我会修改我的答案:
SELECT *
FROM ((SELECT street, zip, city
FROM address
WHERE street LIKE 'Test%'
LIMIT 1
)
UNION ALL
(SELECT street, zip, city
FROM address
WHERE ord = 0
LIMIT 1
)
) t
ORDER BY (CASE WHEN street LIKE 'Test%' THEN 1 ELSE 0 END) DESC
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
这允许查询使用两个索引(street和ord).请注意,这只是因为LIKE模式不是以通配符开头.如果LIKE模式以通配符开头,则此查询形式仍将执行全表扫描.