Ein CASE
Aussage kann helfen. In diesem Beispiel:
- die
source
, sam, ist auf Position 8 - das
target
, bob, ist auf Position 2
Indem die Variablen durch die tatsächlichen Werte ersetzt werden, verschiebt die folgende Anweisung alles um 2 nach unten von der Quelle, lässt die Elemente zwischen den Elementen unverändert, setzt das Ziel gleich der Quelle und verschiebt den Rest nach unten:
postgres=> SELECT * FROM test order by sortval;
name | sortval
------+---------
bob | 2
tom | 4
mary | 6
sam | 8
tim | 10
(5 rows)
postgres=> UPDATE test
postgres-> SET sortval = CASE WHEN sortval <= 2 THEN sortval - 2
postgres-> WHEN sortval = 8 THEN 2
postgres-> WHEN sortval >= 8 THEN sortval - 2
postgres-> ELSE sortval
postgres-> END;
UPDATE 5
postgres=> SELECT * FROM test order by sortval;
name | sortval
------+---------
bob | 0
sam | 2
tom | 4
mary | 6
tim | 8
(5 rows)
Das würde die Liste etwas nach oben verschieben. Eine ähnliche Logik könnte angewendet werden, um sich in einer Liste nach unten zu bewegen. Und es geht davon aus, dass negative Zahlen in Ordnung sind und dass nur die relative Reihenfolge von Interesse ist.