Interval函数用于返回N 值在区间段所在的索引位置。(注意官网上的描述有点问题的,并不是N小于等于N1,为0)
INTERVAL()函数可以返回分段后的结果,语法如下:
INTERVAL(N,N1,N2,N3,..........)
其中,N是要判断的数值,N1,N2,N3,...是分段的间隔。
这个函数的返回值是段的位置:
如果N<N1,则返回0,
如果N1<=N<N2,则返回1,
如果N2<=N<N3,则返回2。
所以,区间是前闭后开的,以此类推。
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); +--------------------------------------+ | INTERVAL(23, 1, 15, 17, 30, 44, 200) | +--------------------------------------+ | 3 | +--------------------------------------+ -- (23小于30,30的位置是4,于是返回3) mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); +--------------------------------+ | INTERVAL(10, 1, 10, 100, 1000) | +--------------------------------+ | 2 | +--------------------------------+ -- (10 大于等于10,小于100,于是返回2) mysql> SELECT INTERVAL(22, 23, 30, 44, 200); +-------------------------------+ | INTERVAL(22, 23, 30, 44, 200) | +-------------------------------+ | 0 | +-------------------------------+ -- (22小于23,23的位置是1,于是返回0)
可以利用INTERVAL做区间判断,比如查询分数区间,转换状态等;
这是详细信息得内容。
-- 创建数据表 CREATE TABLE student ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), score INT, sex VARCHAR(10) ); -- 插入数据 INSERT INTO student (name, score, sex) VALUES ('张三', 80, '1'); INSERT INTO student (name, score, sex) VALUES ('李四', 90, '0'); INSERT INTO student (name, score, sex) VALUES ('王五', 70, NULL); INSERT INTO student (name, score, sex) VALUES ('赵六', 40, '2'); INSERT INTO student (name, score, sex) VALUES ('陈七', 60, '');
原始数据:
mysql> select * from student; +----+--------+-------+------+ | id | name | score | sex | +----+--------+-------+------+ | 1 | 张三 | 80 | 1 | | 2 | 李四 | 90 | 0 | | 3 | 王五 | 70 | NULL | | 4 | 赵六 | 40 | 2 | | 5 | 陈七 | 60 | | +----+--------+-------+------+
查询分数区间
现在统计分数小于60的为不及格的人数,大于等于60小于80的为中等的人数,大于等于80小于100的为优秀,等于100的为满分
配合ELT函数sql语句可以这样写:
mysql> SELECT name,score,ELT(INTERVAL(score,0,60,80,100),'不及格','中等','优秀','满分') as score_level FROM student; +--------+-------+-------------+ | name | score | score_level | +--------+-------+-------------+ | 张三 | 80 | 优秀 | | 李四 | 90 | 优秀 | | 王五 | 70 | 中等 | | 赵六 | 40 | 不及格 | | 陈七 | 60 | 中等 | +--------+-------+-------------+
转换状态
我们在项目中还有一个地方也会经常用到,比如需要在查询时候,把存在数据表中的状态值(一般是数字)转换成对应的中文描述值。
mysql> SELECT name,sex,ELT(INTERVAL(sex,0,1,2),'未知性别','男','女') as sex_text FROM student; +--------+------+--------------+ | name | sex | sex_text | +--------+------+--------------+ | 张三 | 1 | 男 | | 李四 | 0 | 未知性别 | | 王五 | NULL | NULL | | 赵六 | 2 | 女 | | 陈七 | | 未知性别 | +--------+------+--------------+ 5 rows in set (0.00 sec)
由于sex可能为null值,返回的索引值就是-1,在ELT函数中就没有对应值,也会返回null,如果不想出现NULL值可以加上IFNULL函数判断,请看一下语句:
mysql> SELECT name,sex,IFNULL(ELT(INTERVAL(sex,0,1,2),'未知性别','男','女'),'') as sex_text FROM student; +--------+------+--------------+ | name | sex | sex_text | +--------+------+--------------+ | 张三 | 1 | 男 | | 李四 | 0 | 未知性别 | | 王五 | NULL | | | 赵六 | 2 | 女 | | 陈七 | | 未知性别 | +--------+------+--------------+