sql >> Databáze >  >> RDS >> PostgreSQL

Vyberte první záznam, pokud žádný neodpovídá

Jste na správné cestě. Stačí přidat 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;

Nebo alternativně:

ORDER BY ord DESC

Každá z těchto možností vloží ord = 0 řada poslední.

EDIT:

Erwin uvádí dobrou věc, že ​​z pohledu použití indexu OR v WHERE klauzule není nejlepší přístup. Upravil bych svou odpověď na:

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;

To umožňuje dotazu využívat dva indexy (street a ord ). Všimněte si, že je to opravdu jen proto, že LIKE vzor nezačíná zástupným znakem. Pokud LIKE vzor začíná zástupným znakem, pak by tato forma dotazu stále prováděla úplné prohledání tabulky.



  1. Jak obnovit heslo root mysql?

  2. Jaký je rozdíl mezi RANK a DENSE_RANK v SQL?

  3. Oracle 12:Připojit se na seznam oddělený čárkami?

  4. Vyberte 3 nejnovější záznamy, kde jsou hodnoty jednoho sloupce odlišné