如果没有匹配则选择第一条记录

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语句执行此操作的方法是什么?

Gor*_*off 5

你走在正确的轨道上.只需添加一个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提出了一个很好的观点,从索引使用的角度来看,ORWHERE条款中的一个并不是最好的方法.我会修改我的答案:

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)

这允许查询使用两个索引(streetord).请注意,这只是因为LIKE模式不是以通配符开头.如果LIKE模式以通配符开头,则此查询形式仍将执行全表扫描.