case when遇到的問題

1、數據庫表

user表結構和數據

CREATE TABLE `user`  (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
  `age` int(11) NOT NULL COMMENT '年齡',
  `status` int(11) NOT NULL DEFAULT 0 COMMENT '狀態',
  `points` int(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '積分',
  `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES (1, '張三', 12, 0, 0, '2020-04-20 19:07:47', '2020-04-20 19:07:47');

user_test表

CREATE TABLE `user_test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

2、case when查詢錯誤

當user_test沒有數據時,也要查出user的數據

SELECT
	u.*,
	ut.* 
FROM
	USER u
	LEFT JOIN user_test ut ON ( u.id = ut.user_id ) 
WHERE
	u.id = 1 
AND
CASE
	
	WHEN u.age = 11 THEN
	ut.id = 1 END;

查詢結果是空的,因爲沒有else。

3、正確的寫法

SELECT
	u.*,
	ut.* 
FROM
	USER u
	LEFT JOIN user_test ut ON ( u.id = ut.user_id ) 
WHERE
	u.id = 1 
AND
CASE
	
	WHEN u.age = 11 THEN
	ut.id = 1 ELSE 1 = 1 END;

4、OR的寫法

SELECT
	u.*,
	ut.* 
FROM
	USER u
	LEFT JOIN user_test ut ON ( u.id = ut.user_id ) 
WHERE
	u.id = 1 
	AND ( ( u.age = 11 AND ut.id = 1 ) OR ( 1 = 1 ) );

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章