sql >> Base de Datos >  >> RDS >> Mysql

Declaración UPDATE para reasignar un valor de columna de acuerdo con una fórmula numérica

UN CASE declaración puede ayudar. En este ejemplo:

  • la source , sam, está en la posición 8
  • el target , bob, está en la posición 2

Reemplazando las variables con los valores reales, la siguiente declaración desplaza todo hacia abajo 2 desde el origen, deja el entre miembros como está, establece el objetivo igual al origen, mueve el resto hacia abajo:

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)

Eso movería algo en la lista. Se podría aplicar una lógica similar para bajar en una lista. Y asume que los números negativos están bien y que solo el orden relativo es de interés.