Un CASE
la dichiarazione può aiutare. In questo esempio:
- il
source
, sam, è alla posizione 8 - il
target
, bob, è in posizione 2
Sostituendo le variabili con i valori effettivi, la seguente istruzione sposta tutto in basso di 2 dalla fonte, lascia i membri intermedi così com'è, imposta la destinazione uguale a source, sposta il resto in basso:
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)
Ciò sposterebbe qualcosa in cima alla lista. Una logica simile potrebbe essere applicata per spostarsi verso il basso di un elenco. E presuppone che i numeri negativi vadano bene e che solo l'ordinamento relativo sia di interesse.