我正在尝试仅在一行中交换两列。
例如,我们有一个这样的表:
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
等时重命名结果。
答案 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
注意:这不会更改数据库中的数据。相反,它只是以不同的方式显示数据。
-
更新:以下沙箱中的完整示例:
答案 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()
来获取A
和C
的值
和CASE
来检查哪个是B
的中间值。
答案 2 :(得分:0)
如果您以string interpolation的install扩展名,这很容易:
ArrayList<Sheet>