PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изберете първия запис, ако никой не съвпада

Вие сте на прав път. Просто добавете 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;

Или алтернативно:

ORDER BY ord DESC

Всяко от тях ще постави ord = 0 ред последен.

РЕДАКТИРАНЕ:

Ървин изтъква добър момент, че от гледна точка на използването на индекса, 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;

Това позволява на заявката да използва два индекса (street и ord ). Имайте предвид, че това е наистина само защото LIKE моделът не започва с заместващ знак. Ако LIKE шаблонът започва с заместващ знак, след което тази форма на заявката ще направи пълно сканиране на таблицата.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете потребител само за четене в PostgreSQL

  2. Защо не мога да използвам псевдоними на колони в следващия израз SELECT?

  3. Изберете само днешните (от полунощ) времеви марки

  4. Postgres Query Plan защо оценката на ред е толкова грешна

  5. Нови функции за съвместимост на Oracle в PostgresPlus Advanced Server 9.3Beta