2017-10-27 2 views
1

ich die folgenden Werte haben:Charaktere zu zwingen sql Art zu Ende

is_flagged name 
0    Titanic 
1    Avatar 
0    Jesse 
0    トゥー・フォー・ザ・マネー (字幕版) 

ich namentlich zuerst von is_flagged, dann sortieren möchten. Aus verschiedenen Gründen muss ich die Sortierung in eine Anweisung aufnehmen.

Wie würde ich diejenigen, wo is_flagged = 0 bis zum Ende (jenseits jedes Zeichens) setzen. Bisher habe ich:

ORDER BY 
    CASE WHEN is_flagged IS TRUE THEN name else 'ZZZ' END 

Grundsätzlich wie verwende ich Zeichen (was ist jetzt ‚ZZZ‘) bis zum Ende zu gehen. Bitte beachten Sie, dass Ich bin nicht für diese Antwort suchen:

ORDER BY is_flagged DESC, name ASC 
+4

* Warum * suchen Sie nicht nach dieser Antwort? Was ist falsch daran, die einfachste/beste Antwort zu verwenden? – Andreas

+0

Ich habe verschiedene andere Sortierungen in der SQL-Abfrage und ich muss einen Weg sortieren, wenn is_flagged = True und ein anderer Weg, wenn is_flagged = False. – David542

+5

Fragen Sie dann, wie das geht. Ihre Frage ist ein [XY-Problem] (https://meta.stackexchange.com/q/66377/351454). --- [Antwort von Mureinik] (https://stackoverflow.com/a/46983170/5221149) hat Ihnen eine gute Lösung gegeben, aber es könnte nicht die * richtige * Lösung für Ihr tatsächliches Problem sein. – Andreas

Antwort

1

Ein einfacher Hack ist die Spalten concatinate Sie sortieren möchten:

ORDER BY CONCAT(CASE is_flagged WHEN 0 THEN 'z' ELSE 'a' END, name) 
+0

Danke, ich mag diesen Ansatz. Ist "z" das niedrigste Zeichen? Was ist mit japanischen oder anderen Unicode-Zeichen usw. – David542

+0

@ David542 die Reihenfolge zwischen 'z' und einem japanischen Zeichen ist belanglos - entweder ein' z' oder ein 'a' wird dem Namen vorangestellt (abhängig vom Wert von' is_flagged '), und' a' kommt vor 'z'. Zwischen den Zeilen mit den gleichen 'is_flagged'-Werten erfolgt die Sortierung effektiv nach den Namen. – Mureinik

+0

Verstanden - danke das macht Sinn. – David542

0
ORDER BY is_flagged DESC 
, CASE WHEN is_flagged = 1 THEN sortAvalue1 ELSE NULL END 
, CASE WHEN is_flagged = 1 THEN sortAvalue2 ELSE NULL END 
, CASE WHEN is_flagged = 1 THEN sortAvalue3 ELSE NULL END 
, CASE WHEN is_flagged = 1 THEN sortAvalue4 ELSE NULL END 
, CASE WHEN is_flagged = 0 THEN sortBvalue1 ELSE NULL END 
, CASE WHEN is_flagged = 0 THEN sortBvalue2 ELSE NULL END 
, CASE WHEN is_flagged = 0 THEN sortBvalue3 ELSE NULL END 
, CASE WHEN is_flagged = 0 THEN sortBvalue4 ELSE NULL END 

Diese Arbeit sollte auch wenn die is_flagged-Werte sekundär nach völlig unterschiedlichen Datentypen sortiert sind.

Wenn die Sortierkriterien Typen teilen, können sie wie folgt zusammengeführt werden: CASE WHEN is_flagged = 1 THEN sortAvalue1 ELSE sortBvalue1 END; Aber nach meiner Erfahrung sind solche Abfragen etwas schwieriger zu warten.

Verwandte Themen