如何在MySQL中查询每行首个值为1的列标识(L0/L1等)
问题需求
我数据库中有如下结构的action表,希望用SELECT语句获取每行中第一个值为1的列对应的标识:
- 若一行存在多个值为1的列,取最先出现的那个列的标识(比如
action_level_0对应L0,action_level_1对应L1,以此类推) - 示例:第一行对应L0,第五行对应L3
表的初始化SQL语句如下:
CREATE TABLE `action` ( `action_id` BIGINT NOT NULL AUTO_INCREMENT, `action_level_0` SMALLINT DEFAULT NULL COMMENT 'L0', `action_level_1` SMALLINT DEFAULT NULL COMMENT 'L1', `action_level_2` SMALLINT DEFAULT NULL COMMENT 'L2', `action_level_3` SMALLINT DEFAULT NULL COMMENT 'L3', PRIMARY KEY (`action_id`) ) ENGINE=INNODB AUTO_INCREMENT=2; INSERT INTO `action` (`action_level_0`,`action_level_1`,`action_level_2`,`action_level_3`) VALUES (1,0,0,0), (0,1,0,0), (0,0,1,0), (0,0,0,1), (0,0,0,1);
期望查询结果:
| result |
|---|
| L0 |
| L1 |
| L2 |
| L3 |
| L3 |
解决方案
利用CASE WHEN语句的顺序判断特性,按列的先后顺序依次检查是否为1,第一个满足条件的就返回对应的标识:
SELECT CASE WHEN action_level_0 = 1 THEN 'L0' WHEN action_level_1 = 1 THEN 'L1' WHEN action_level_2 = 1 THEN 'L2' WHEN action_level_3 = 1 THEN 'L3' ELSE '0' -- 处理所有列都不为1的情况,对应你提到的第八行示例 END AS result FROM `action`;
结果验证
执行上述SQL后,会得到期望的结果:每行返回第一个值为1的列的标识,所有列都不为1时返回'0'。
内容的提问来源于stack exchange,提问作者Smile
相关产品推荐
相关产品推荐

