INTERVAL()¶
INTERVAL(N, N1, N2, N3, …) 使用快速二分查找返回小于等于 N 的最大阈值的位置索引。若 N < N1 则返回 0,若 N 为 NULL 则返回 -1,比较时自动跳过 NULL 阈值。
函数说明¶
INTERVAL(N, N1, N2, N3, ...) 将值 N 与一组已排序的阈值 N1, N2, N3, ... 进行比较,返回小于等于 N 的最大阈值的索引位置:
若
N<N1,返回 0。若
N1<=N<N2,返回 1。若
N2<=N<N3,返回 2。依此类推。
所有参数均视为整数处理。阈值必须按非递减顺序排列,以便函数使用内部二分查找获得正确结果。
若 N 为 NULL,函数返回 -1。比较时自动跳过任何 NULL 阈值。
函数语法¶
> INTERVAL(N, N1, N2, N3, ...)
参数释义¶
参数 |
说明 |
|---|---|
N |
必要参数。需要与阈值列表进行比较的值。 |
N1, N2, … |
必要参数(至少一个阈值)。用于比较的已排序整数阈值列表。 |
示例¶
DROP DATABASE IF EXISTS test_interval;
CREATE DATABASE test_interval;
USE test_interval;
-- 基本比较
SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
-- 23 < 30, 返回 3(17 的位置,最后一个 <= 23 的阈值)
-- 相等会前进到下一个阈值
SELECT INTERVAL(10, 1, 10, 100);
-- 10 >= 10 (N2), 返回 2
-- 值小于所有阈值
SELECT INTERVAL(0, 1, 10, 100);
-- 0 < 1, 返回 0
-- 值大于所有阈值
SELECT INTERVAL(101, 1, 10, 100);
-- 101 >= 100, 返回 3
-- 重复阈值
SELECT INTERVAL(10, 1, 10, 10, 10, 100);
-- 10 >= 每个 10, 返回 4(100 之前最后一个 10 的索引)
-- NULL 处理
SELECT INTERVAL(NULL, 1, 10, 100);
-- N 为 NULL, 返回 -1
SELECT INTERVAL(10, 1, NULL, 100);
-- NULL 阈值被跳过, N=10 >= N1=1 且 10 < N3=100, 返回 1
-- 负数值
SELECT INTERVAL(-10, -20, -10, 0, 10);
-- -10 >= -10 (-20 <= -10), 返回 2
-- 浮点数(转换为整数)
SELECT INTERVAL(2.9, 1, 2, 3, 4);
-- 2.9 -> 2, 2 >= 2, 返回 2
-- 字符串转换为整数
SELECT INTERVAL('10', '1', '10', '100');
-- '10' -> 10, 10 >= 10, 返回 2
-- 表达式作为第一个参数
SELECT INTERVAL(5 + 5, 1, 10, 100);
-- 10 >= 10, 返回 2
-- 表中使用
DROP TABLE IF EXISTS t_func_interval;
CREATE TABLE t_func_interval(
id INT,
n INT,
t1 INT,
t2 INT,
t3 INT
);
INSERT INTO t_func_interval VALUES
(1, 0, 1, 10, 100),
(2, 5, 1, 10, 100),
(3, 10, 1, NULL, 100),
(4, NULL, 1, 10, 100);
SELECT id, INTERVAL(n, t1, t2, t3) FROM t_func_interval ORDER BY id;
DROP TABLE t_func_interval;
DROP DATABASE test_interval;
注意事项¶
INTERVAL()函数内部使用二分查找以提高效率,因此阈值列表N1, N2, N3, ...必须按非递减顺序排列。如果阈值未排序,结果将不可预测。此函数与日期运算中的
INTERVAL关键字(如DATE_ADD('2024-01-01', INTERVAL 1 DAY))不同,两者可以在同一条 SQL 语句中共存。非整数参数(浮点数、字符串)在比较前会转换为整数。无法转换为整数的字符串会导致错误。
INTERVAL()至少需要一个阈值参数。仅使用一个参数(如INTERVAL(N))调用会报错。