mysql - mysql case语句中断
问题描述
我使用下面case
的语句来处理我的 sql 中的枚举。但它返回错误的结果。
SELECT material_name,material_id,grade_id,subject_id,course_term_id,
CASE grade_id
WHEN grade_id = 1 THEN "一年级"
WHEN grade_id = 2 THEN "二年级"
WHEN grade_id = 3 THEN "三年级"
WHEN grade_id = 4 THEN "四年级"
WHEN grade_id = 5 THEN "五年级"
WHEN grade_id = 6 THEN "六年级"
WHEN grade_id = 7 THEN "初一"
WHEN grade_id = 8 THEN "初二"
WHEN grade_id = 9 THEN "初三"
WHEN grade_id = 10 THEN "高一"
WHEN grade_id = 11 THEN "高二"
WHEN grade_id = 12 THEN "高三"
ELSE "" END as grade,
CASE subject_id
WHEN subject_id = 1 THEN "数学"
WHEN subject_id = 2 THEN "物理"
WHEN subject_id = 3 THEN "化学"
WHEN subject_id = 4 THEN "语文"
WHEN subject_id = 5 THEN "英语"
WHEN subject_id = 6 THEN "科学"
WHEN subject_id = 7 THEN "音乐"
WHEN subject_id = 8 THEN "绘画"
WHEN subject_id = 9 THEN "政治"
WHEN subject_id = 10 THEN "历史"
WHEN subject_id = 11 THEN "地理"
WHEN subject_id = 12 THEN "生物"
WHEN subject_id = 13 THEN "奥数"
ELSE "" END as subject,
CASE course_term_id
WHEN course_term_id = 1 THEN "春"
WHEN course_term_id = 2 THEN "暑"
WHEN course_term_id = 3 THEN "秋"
WHEN course_term_id = 4 THEN "寒"
ELSE "" END as season,
created_at, updated_at from sc_materials where material_id in (2025,317,2050);
当我按照Bill Karwin 的评论使用ELSE COALESCE(grade_id, '<NULL>') END
时,它显示,
这是我在这些字段中使用的数据类型,
grade_id int
subject_id int
course_term_id tinyint
mysql -V
mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1
解决方案
好的,我在您使用 CASE 时发现了一些东西。很抱歉我一开始没有注意到这一点。
CASE有两种形式:
CASE <expr1> WHEN <expr2> THEN <result> ...
CASE WHEN <expr3> THEN <result> ...
在第一种形式中,只有当<expr1>
=时情况才成立<expr2>
。
在第二种形式中,如果为真,则情况为<expr3>
真。
阅读https://dev.mysql.com/doc/refman/8.0/en/control-flow-functions.html#operator_case了解更多详细信息和示例。
但是您似乎正在尝试在<expr2>
. 因此<expr2>
只会是 0 或 1,这取决于比较是假还是真。然后将 0 或 1 的值与 进行比较<expr1>
,因此只有<expr1>
1才会成功。
您应该将您的 CASE 表达式更改为:
CASE grade_id
WHEN 1 THEN "一年级"
WHEN 2 THEN "二年级"
WHEN 3 THEN "三年级"
WHEN 4 THEN "四年级"
WHEN 5 THEN "五年级"
WHEN 6 THEN "六年级"
WHEN 7 THEN "初一"
WHEN 8 THEN "初二"
WHEN 9 THEN "初三"
WHEN 10 THEN "高一"
WHEN 11 THEN "高二"
WHEN 12 THEN "高三"
ELSE "" END as grade,
对于其他 CASE 表达式也是如此。
但我也同意@tadman 的评论——你应该只使用三个查找表。
推荐阅读
- python - Youtube API v 3 中的布尔 OR(Python 代码)
- r - 如何确定层次聚类中的聚类数量
- python - 用下一个递增数字填充空值 | PySpark | Python
- javascript - GWT:将处理程序添加到本机 js 事件 onafterprint
- java - 唯一标识JAVA中终止的线程
- c# - unity register 泛型类型
- java - 辅助注入根据运行时检查注入不同的依赖项
- c# - 登录/注册时抛出 Xero API 错误 500
- module - SuiteCRM:仅用于自定义可导入模块的下拉菜单
- java - 如何只更改字符串中的字母,留下空格、连字符和撇号?