sql >> Database >  >> RDS >> Mysql

Kortsluitlogica evaluatie-operators

Houd er rekening mee dat een query niet verplicht wordt uitgevoerd. De query die je hebt geschreven, kan op meerdere threads worden uitgevoerd, en daarom zou een kortsluitingsoperator in de where-clausule niet slechts één resultaat opleveren.

Gebruik in plaats daarvan de LIMIT clausule om alleen de eerste rij te retourneren.

SELECT * FROM quantitycache
WHERE bookstore_id = 1 OR city_id = 1 OR country_id = 1
ORDER BY bookstore_id IS NULL ASC,
         city_id IS NULL ASC,
         country_id IS NULL ASC
LIMIT 1;

Om de beste overeenkomst te krijgen voor alle boeken in een resultatenset, slaat u de resultaten op in een tijdelijke tabel, zoekt u het beste resultaat en retourneert u vervolgens interessante velden.

CREATE TEMPORARY TABLE results (id int, book_id int, match_rank int);

INSERT INTO results (id, book_id, match_rank)
SELECT id, book_id, 
    -- this assumes that lower numbers are better
    CASE WHEN Bookstore_ID is not null then 1 
         WHEN City_ID is not null then 2 
         ELSE 3 END as match_rank
FROM quantitycache
WHERE bookstore_id = 1 OR city_id = 1 OR country_id = 1;

Select * 
from (
    select book_id, MIN(match_rank) as best_rank 
    from results 
    group by book_id
) as r
inner join results as rid 
    on r.book_id = rid.book_id 
    and rid.match_rank = r.best_rank
inner join quantitycache as q on q.id = rid.id;

DROP TABLE results;



  1. Hoe kan ik een groottelimiet instellen voor een int-gegevenstype in PostgreSQL 9.5

  2. hoe OperationalError op te lossen:(psycopg2.OperationalError) server heeft de verbinding onverwacht gesloten

  3. Gegevens invoegen om op te nemen in sqlite

  4. Een SELECT-query uitvoeren met een Ansible-taak