CASE
ステートメントが役立つ場合があります。この例では:
source
、サム、位置8にありますtarget
、bob、位置2にあります
変数を実際の値に置き換えると、次のステートメントはすべてをソースから2つ下にシフトし、メンバー間をそのままにし、ターゲットをソースに等しく設定し、残りを下に移動します。
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)
それはリストの上の何かを動かすでしょう。リストを下に移動する場合も、同様のロジックを適用できます。また、負の数は問題なく、相対的な順序だけが重要であると想定しています。