sql >> Database >  >> RDS >> PostgreSQL

Is er een postgres CLOSEST-operator?

Ik zit misschien een beetje naast de syntaxis, maar deze geparametriseerde query (alle ? neem de '1' van de oorspronkelijke vraag) zou snel moeten lopen, in feite 2 B-Tree-zoekopdrachten [ervan uitgaande dat het nummer is geïndexeerd].

SELECT * FROM
(
  (SELECT id, number FROM t WHERE number >= ? ORDER BY number LIMIT 1) AS above
  UNION ALL
  (SELECT id, number FROM t WHERE number < ? ORDER BY number DESC LIMIT 1) as below
) 
ORDER BY abs(?-number) LIMIT 1;

Het queryplan hiervoor met een tabel van ~5e5 rijen (met een index op number ) ziet er als volgt uit:

psql => explain select * from (
        (SELECT id, number FROM t WHERE number >= 1 order by number limit 1) 
        union all
        (select id, number from t where number < 1 order by number desc limit 1)
) as make_postgresql_happy 
order by abs (1 - number) 
limit 1;
                                                  QUERY PLAN
--------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.24..0.24 rows=1 width=12)
   ->  Sort  (cost=0.24..0.24 rows=2 width=12)
         Sort Key: (abs((1::double precision - public.t.number)))
         ->  Result  (cost=0.00..0.23 rows=2 width=12)
               ->  Append  (cost=0.00..0.22 rows=2 width=12)
                     ->  Limit  (cost=0.00..0.06 rows=1 width=12)
                           ->  Index Scan using idx_t on t  (cost=0.00..15046.74 rows=255683 width=12)
                                 Index Cond: (number >= 1::double precision)
                     ->  Limit  (cost=0.00..0.14 rows=1 width=12)
                           ->  Index Scan Backward using idx_t on t  (cost=0.00..9053.67 rows=66136 width=12)
                                 Index Cond: (number < 1::double precision)
(11 rows)


  1. Python psycopg2 wordt niet ingevoegd in postgresql-tabel

  2. Hoe ga ik om met het openen/sluiten van een Db-verbinding in een Go-app?

  3. Update SQL-modus in MySQL

  4. mysqli_stmt::bind_param():Aantal elementen in typedefinitietekenreeks komt niet overeen met aantal bindvariabelen