case when遇到的问题

布满荆棘的人生 2023-05-21 10:29 186阅读 0赞

1、数据库表

user表结构和数据

  1. CREATE TABLE `user` (
  2. `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',
  3. `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
  4. `age` int(11) NOT NULL COMMENT '年龄',
  5. `status` int(11) NOT NULL DEFAULT 0 COMMENT '状态',
  6. `points` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '积分',
  7. `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  8. `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  9. PRIMARY KEY (`id`) USING BTREE
  10. ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  11. INSERT INTO `user` VALUES (1, '张三', 12, 0, 0, '2020-04-20 19:07:47', '2020-04-20 19:07:47');

user_test表

  1. CREATE TABLE `user_test` (
  2. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  3. `user_id` bigint(20) NOT NULL,
  4. `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  5. `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  6. PRIMARY KEY (`id`) USING BTREE
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

2、case when查询错误

当user_test没有数据时,也要查出user的数据

  1. SELECT
  2. u.*,
  3. ut.*
  4. FROM
  5. USER u
  6. LEFT JOIN user_test ut ON ( u.id = ut.user_id )
  7. WHERE
  8. u.id = 1
  9. AND
  10. CASE
  11. WHEN u.age = 11 THEN
  12. ut.id = 1 END;

2020042019165021.png

查询结果是空的,因为没有else。

3、正确的写法

  1. SELECT
  2. u.*,
  3. ut.*
  4. FROM
  5. USER u
  6. LEFT JOIN user_test ut ON ( u.id = ut.user_id )
  7. WHERE
  8. u.id = 1
  9. AND
  10. CASE
  11. WHEN u.age = 11 THEN
  12. ut.id = 1 ELSE 1 = 1 END;

20200420192220430.png

4、OR的写法

  1. SELECT
  2. u.*,
  3. ut.*
  4. FROM
  5. USER u
  6. LEFT JOIN user_test ut ON ( u.id = ut.user_id )
  7. WHERE
  8. u.id = 1
  9. AND ( ( u.age = 11 AND ut.id = 1 ) OR ( 1 = 1 ) );

发表评论

表情:
评论列表 (有 0 条评论,186人围观)

还没有评论,来说两句吧...

相关阅读