Ma situation initiale est la suivante :
+------------+-------------+ | legacyRank | forcedRank | +------------+-------------+ | 0 | NULL | | 1 | 6 | | 2 | NULL | | 3 | 1 | | 4 | NULL | | 5 | NULL | | 6 | 2 | +------------+-------------+
Vous pouvez générer ce tableau via le schéma suivant :
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
Le but est que chaque ligne ne contienne pas NULL forcedRank
列的行放置在此 forcedRank
à la position exacte mentionnée dans la colonne. Le rendu attendu est le suivant :
+------------+-------------+ | legacyRank | forcedRank | +------------+-------------+ 0 | 0 | NULL | 1 | 3 | 1 | 2 | 6 | 2 | 3 | 2 | NULL | 4 | 4 | NULL | 5 | 5 | NULL | 6 | 6 | 6 | +------------+-------------+
Comme vous pouvez le voir, si elle n'est pas NULL, chaque ligne est prise lorsqu'elle est triée par la colonne forcedRank
列排序的位置。当 NULL 行仍然按 legacyRank
à une position non occupée par une ligne non NULL, mais la ligne forcée n'est jamais déplacée.
Suite à cet ordre, j'ai essayé en ORDER BY
中使用 CASE WHEN
la syntaxe comme celle-ci :
SELECT * FROM two_column_order order by CASE WHEN (`forcedRank` is NULL ) THEN `legacyRank` END , -`forcedRank` DESC, `legacyRank`
Mais les résultats n’ont pas vraiment répondu à mes attentes :
+------------+-------------+ | legacyRank | forcedRank | +------------+-------------+ | 3 | 1 | | 6 | 2 | | 6 | 6 | | 0 | NULL | | 2 | NULL | | 4 | NULL | | 5 | NULL | +------------+-------------+
Alors, comment puis-je trier les colonnes legacyRank
au-delà des lignes de classement forcé sans les déplacer ?
NULL
不能像您需要使用IS
那样进行比较,或者在您的情况下使用IS NOT
Violon
Parce que la première réponse ne vous donnera pas la bonne réponse.
J'ai modifié l'ordre en ajoutant un point décimal au nombre d'origine afin qu'il soit plus grand que le nouveau classement forcé.
Il maintiendra l'ordre et forcera les nombres à être plus petits que le classement traditionnel et il obtiendra le résultat suivant
Violon