在一行内交换列值

时间:2018-12-12 16:15:05

标签: sql postgresql

我正在尝试仅在一行中交换两列。

例如,我们有一个这样的表:

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 > CB > A > C等时重命名结果。

3 个答案:

答案 0 :(得分:0)

运行以下查询:

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/f/vYiCubo6CHMayqsjvzo5nD/4

答案 1 :(得分:0)

尝试一下:

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()来获取AC的值
CASE来检查哪个是B的中间值。

答案 2 :(得分:0)

如果您以string interpolationinstall扩展名,这很容易:

ArrayList<Sheet>