Meine Ausgangssituation ist wie folgt:
+------------+-------------+ | legacyRank | forcedRank | +------------+-------------+ | 0 | NULL | | 1 | 6 | | 2 | NULL | | 3 | 1 | | 4 | NULL | | 5 | NULL | | 6 | 2 | +------------+-------------+
Sie können diese Tabelle über das folgende Schema generieren:
CREATE TABLE two_column_order ( legacyRank VARCHAR(45), forcedRank VARCHAR(45) ); INSERT INTO two_column_order (legacyRank, forcedRank) VALUES (5, NULL); INSERT INTO two_column_order (legacyRank, forcedRank) VALUES (6, 2); INSERT INTO two_column_order (legacyRank, forcedRank) VALUES (7, NULL); INSERT INTO two_column_order (legacyRank, forcedRank) VALUES (0, NULL); INSERT INTO two_column_order (legacyRank, forcedRank) VALUES (1, NULL); INSERT INTO two_column_order (legacyRank, forcedRank) VALUES (2, 6); INSERT INTO two_column_order (legacyRank, forcedRank) VALUES (3, NULL); INSERT INTO two_column_order (legacyRank, forcedRank) VALUES (4, 1); SELECT * FROM two_column_order order by CASE when `forcedRank` <> NULL THEN `forcedRank` ELSE `legacyRank` END
Das Ziel besteht darin, dass jede Zeile nicht NULL forcedRank
列的行放置在此 forcedRank
an der genauen Position enthält, die in der Spalte angegeben ist. Das erwartete Rendering ist wie folgt:
+------------+-------------+ | legacyRank | forcedRank | +------------+-------------+ 0 | 0 | NULL | 1 | 3 | 1 | 2 | 6 | 2 | 3 | 2 | NULL | 4 | 4 | NULL | 5 | 5 | NULL | 6 | 6 | 6 | +------------+-------------+
Wie Sie sehen können, wird jede Zeile, wenn sie nicht NULL ist, beim Sortieren nach der forcedRank
列排序的位置。当 NULL 行仍然按 legacyRank
-Spalte an einer Position übernommen, die nicht von einer Nicht-NULL-Zeile besetzt ist, aber die erzwungene Zeile wird nie verschoben.
In dieser Reihenfolge habe ich es in ORDER BY
中使用 CASE WHEN
einer Syntax wie dieser versucht:
SELECT * FROM two_column_order order by CASE WHEN (`forcedRank` is NULL ) THEN `legacyRank` END , -`forcedRank` DESC, `legacyRank`
Aber die Ergebnisse entsprachen nicht wirklich meinen Erwartungen:
+------------+-------------+ | legacyRank | forcedRank | +------------+-------------+ | 3 | 1 | | 6 | 2 | | 6 | 6 | | 0 | NULL | | 2 | NULL | | 4 | NULL | | 5 | NULL | +------------+-------------+
Wie kann ich also die Reihenfolge der legacyRank
Spalten über die ForcedRank-Zeilen hinaus festlegen, ohne sie zu verschieben?
NULL
不能像您需要使用IS
那样进行比较,或者在您的情况下使用IS NOT
小提琴
因为第一个答案不会给你正确的答案。
我通过在原始数字上添加小数点来更改顺序,以便它比新的强制排名更大。
它将保持顺序,并且强制数字小于传统排名,它会得到以下结果
小提琴