我有这张桌子:
table1
+------+----------+-----------+----------+
| id | org1 | org2 | org3 |
+------+----------+-----------+----------+
| 1 | HR | (NULL) | Staff |
+------+----------+-----------+----------+
| 2 | (NULL) | IT | Dev |
+------+----------+-----------+----------+
| 3 | (NULL) | (NULL) | Finance |
+------+----------+-----------+----------+
Run Code Online (Sandbox Code Playgroud)
我想将所有值都移到左边,所以最终结果是:
table1
+------+----------+-----------+----------+
| id | org1 | org2 | org3 |
+------+----------+-----------+----------+
| 1 | HR | Staff | (NULL) |
+------+----------+-----------+----------+
| 2 | IT | Dev | (NULL) |
+------+----------+-----------+----------+
| 3 | Finance | (NULL) | (NULL) |
+------+----------+-----------+----------+
Run Code Online (Sandbox Code Playgroud)
这有什么优雅的方式吗?
更新:
根据cars10的答案,需要切换顺序COALESCE(org2,org3)并考虑所有 3 列的情况NOT NULL
SELECT id, o1,
CASE WHEN o2!=o1 THEN o2 END o2,
CASE WHEN o3!=o2 THEN o3 END o3
FROM
(
SELECT id
,COALESCE(org1,org2,org3) o1
,IF((org1 IS NOT NULL) AND (org2 IS NOT NULL) AND (org3 IS NOT NULL),
org2,
COALESCE(org3,org2)
) o2
,org3 o3
FROM table1
) t
Run Code Online (Sandbox Code Playgroud)
添加 cars10 提到的案例:
DROP TABLE IF EXISTS table1;
CREATE TABLE `table1` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`org1` VARCHAR(255) DEFAULT NULL,
`org2` VARCHAR(255) DEFAULT NULL,
`org3` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `table1` VALUES ('1', NULL, 'IT', 'DEV');
INSERT INTO `table1` VALUES ('2', 'HR',NULL,'Staff');
INSERT INTO `table1` VALUES ('3', 'ID','Building',NULL);
INSERT INTO `table1` VALUES ('4', 'Support','Business','1st line');
INSERT INTO `table1` VALUES ('5','Finance', NULL, NULL);
INSERT INTO `table1` VALUES ('6', NULL, 'Finance', NULL );
INSERT INTO `table1` VALUES ('7', NULL, NULL, 'Finance');
INSERT INTO `table1` VALUES ('8', NULL, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)
http://www.sqlfiddle.com/#!9/cd969/1
正如Thorsten Kettner提到的,没有优雅的方法可以做到这一点。我在上面找到了最短的工作解决方案。