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 ) );