sql >> データベース >  >> RDS >> PostgreSQL

postgres CLOSESTオペレーターはありますか?

    構文が少しずれているかもしれませんが、このパラメーター化されたクエリ(すべての?は元の質問の「1」を取ります)は高速に実行されるはずです。基本的には2つのBツリールックアップです[数値がインデックス付けされていると仮定します]。

    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;
    

    〜5e5行のテーブル(numberにインデックスがある)を使用したこのクエリプラン )は次のようになります:

    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. ナンバーシリーズジェネレータチャレンジソリューション–パート2

    2. Oracleのプラス(+)サインインを使用した左結合と右結合

    3. plpgsqlのトリガー関数の複数の列を更新します

    4. MySQL match()against()-関連性と列で並べ替えますか?