Поменять значения столбцов в пределах одной строки - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь поменять два столбца только в одной строке.

Например, у нас есть такая таблица:

Table T:
row #    A  |  B  |  C
        ---------------
  1      1  |  2  |  3
  2      5  |  4  |  6
  3      7  |  8  |  9

Я пытаюсь поменять два значения в строке # 2Я хочу изменить 5, 4, 6 на 4, 5, 6, не затрагивая другие столбцы.Результат должен выглядеть примерно так:

Table T:
row #    A  |  B  |  C
        ---------------
  1      1  |  2  |  3
  2      4  |  5  |  6
  3      7  |  8  |  9

Что мне делать с помощью SQL?

Продолжение:

Этот вопрос возникает, когда я хочу отсортировать в строке,A, B, C можно рассматривать как три точки, составляющие треугольник.Чтобы избежать повторения, я бы хотел отсортировать A, B, C по порядку от малого к большому.Вот почему я спрашиваю, как поменять значение в строках, не затрагивая другие.

Теперь я действительно нахожу способ сортировки чисел, но с грубой силой UNION и переименованием результата в каждом случае, напримеркогда A > B > C или B > A > C и т. д.

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Попробуйте:

UPDATE tablename
SET
  A = LEAST(A, B, C),
  C = GREATEST (A, B, C),
  B = CASE 
        WHEN A > LEAST(A, B, C) AND A < GREATEST (A, B, C) THEN A
        WHEN C > LEAST(A, B, C) AND C < GREATEST (A, B, C) THEN C
        ELSE B
      END
WHERE NOT (A <= B AND B <= C);

он использует LEAST() и GREATEST(), чтобы получить значения для A и Cи CASE, чтобы проверить, какое промежуточное значение для B.

0 голосов
/ 15 декабря 2018

Если вы устанавливаете расширение intarray , это довольно просто:

update t
   set a = (sort(array[a,b,c]))[1],
       b = (sort(array[a,b,c]))[2],
       c = (sort(array[a,b,c]))[3]
;
0 голосов
/ 12 декабря 2018

Выполнение следующего запроса:

SELECT 
  CASE WHEN ROW_NUMBER() over () = 2 THEN T.B ELSE T.A END AS A1,
  CASE WHEN ROW_NUMBER() over () = 2 THEN T.A ELSE T.B END AS B2,
  T.C
FROM T;

Возвращает ожидаемый результат:

         A  |  B  |  C
        ---------------
  1      1  |  2  |  3
  2      5  |  4  |  6
  3      7  |  8  |  9

Примечание: Это не меняет данные в базе данных.Скорее, он просто отображает данные другим способом.

-

Обновление: Полный рабочий пример в следующей песочнице:

https://www.db -fiddle.com / ж / vYiCubo6CHMayqsjvzo5nD / 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...