加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 是否有postgres CLOSEST运算符?

发布时间:2020-12-12 16:39:48 所属栏目:MsSql教程 来源:网络整理
导读:我正在寻找一些东西,给一张桌子像: | id | number || 1 | .7 || 2 | 1.25 || 3 | 1.01 || 4 | 3.0 | 查询SELECT * FROM my_table WHEREnumberCLOSEST(1)将返回第3行.我只关心数字.现在我有一个程序,只是循环遍历每一行,并进行比较,但我认为信息应该可以从b树
我正在寻找一些东西,给一张桌子像:
| id | number |
|  1 |     .7 |
|  2 |   1.25 |
|  3 |   1.01 |
|  4 |    3.0 |

查询SELECT * FROM my_table WHEREnumberCLOSEST(1)将返回第3行.我只关心数字.现在我有一个程序,只是循环遍历每一行,并进行比较,但我认为信息应该可以从b树索引,所以这可能是一个内置的,但我找不到任何提示它的文件.

解决方法

我可能会稍微偏离语法,但是这个参数化查询(所有这些都是原始问题的’1′)应该运行得很快,基本上是2个B树查找[假设number被索引].
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行(数字索引)的表的查询计划如下所示:

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读