INTERVAL
描述
INTERVAL 函数使用二分查找返回第一个严格大于 N 的阈值位置索引。该函数要求阈值参数按升序排列(N1 ≤ N2 ≤ N3 ≤ ... ≤ Nn)才能正确使用二分查找算法,从而获得最佳性能。
- 所有参数都被视为整数类型。
- 使用二分查找算法,时间复杂度为 O(log n),性能优异。
该函数与 MySQL 中的 interval 函数 行为一致。
语法
INTERVAL(N, N1, N2, N3, ...)
参数
| 参数 | 说明 |
|---|---|
N | 待查找的值,整数类型。 |
N1, N2, N3, ... | 阈值列表,整数类型,且要求按升序排列(N1 ≤ N2 ≤ N3 ≤ ... ≤ Nn)。至少需要一个阈值参数 |
返回值
返回第一个严格大于 N 的阈值位置索引(从 0 开始计数),为整数类型。
若 N 为 NULL 则返回-1。
若阈值参数(N1, N2, ...) 为 NULL,则将其视为 0。
举例
-- 基本用法
SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
+-----------------------------------------+
| INTERVAL(23, 1, 15, 17, 30, 44, 200) |
+-----------------------------------------+
| 3 |
+-----------------------------------------+
SELECT INTERVAL(10, 1, 10, 100, 1000);
+-----------------------------------+
| INTERVAL(10, 1, 10, 100, 1000) |
+-----------------------------------+
| 2 |
+-----------------------------------+
-- 边界情况:小于第一个阈值
SELECT INTERVAL(0, 1, 10, 100);
+--------------------------+
| INTERVAL(0, 1, 10, 100) |
+--------------------------+
| 0 |
+--------------------------+
-- 边界情况:大于所有阈值
SELECT INTERVAL(200, 1, 10, 100);
+----------------------------+
| INTERVAL(200, 1, 10, 100) |
+----------------------------+
| 3 |
+----------------------------+
-- 边界情况:等于某个阈值
SELECT INTERVAL(33, 1, 10, 32, 33, 102, 200);
+-------------------------------------------+
| INTERVAL(33, 1, 10, 32, 33, 102, 200) |
+-------------------------------------------+
| 4 |
+-------------------------------------------+
-- 首个参数为 NULL 值
SELECT INTERVAL(NULL, 1, 10, 100);
+----------------------------+
| INTERVAL(NULL, 1, 10, 100) |
+----------------------------+
| -1 |
+----------------------------+
-- 后续参数为 NULL 值会将其替换为整数`0`
SELECT INTERVAL(3, -1, NULL, 2, 3, 4);
+--------------------------------+
| INTERVAL(3, -1, NULL, 2, 3, 4) |
+--------------------------------+
| 4 |
+--------------------------------+
-- 由 NULL 值导致的序列未按升序排序 从而导致二分结果错误
SELECT INTERVAL(20, 7, NULL, 14, NULL, 25, NULL, 50);
+-----------------------------------------------+
| INTERVAL(20, 7, NULL, 14, NULL, 25, NULL, 50) |
+-----------------------------------------------+
| 6 |
+-----------------------------------------------+
-- 输入单个参数,报错
SELECT INTERVAL(33);
ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: interval(TINYINT)