Oracle SQL 以重复模式更新行
Oracle SQL to Update rows in repeating pattern
如何使用给定的重复数字序列更新行。
我的table如下
line_type
line_val
line_pattern
A
1
null
A
2
null
B
5
null
B
6
null
C
3
null
C
4
null
现在我想用 8532 的重复模式更新列值
所以更新后的 table 看起来像
line_type
line_val
line_pattern
A
1
8
A
2
5
B
5
3
B
6
2
C
3
8
C
4
5
如何在更新语句中实现这一点?
根据您提供的数据无法满足您的要求。 table 中的数据未按特定顺序存储。如果你想在select语句中保证顺序,你需要提供一个ORDER BY
子句。
在下面的代码中有一个额外的列“ORDER_BY”来指定需要处理记录的顺序。使用 MOD
函数计算重复模式,将行号转换为 4 个数字的重复序列,然后 CASE
将这些数字中的每一个映射到其各自的模式位置。
WITH test_data (order_by, line_type, line_val)
AS
(
SELECT 1, 'A',1 FROM DUAL UNION ALL
SELECT 2, 'A',2 FROM DUAL UNION ALL
SELECT 3, 'B',5 FROM DUAL UNION ALL
SELECT 4, 'B',6 FROM DUAL UNION ALL
SELECT 5, 'C',3 FROM DUAL UNION ALL
SELECT 6, 'C',4 FROM DUAL
)
SELECT
CASE MOD(ROW_NUMBER() OVER (ORDER BY order_by),4)
WHEN 1 THEN 8
WHEN 2 THEN 5
WHEN 3 THEN 3
WHEN 0 THEN 2
END as line_pattern,
t.*
FROM
test_data t
LINE_PATTERN ORDER_BY L LINE_VAL
------------ ---------- - ----------
8 1 A 1
5 2 A 2
3 3 B 5
2 4 B 6
8 5 C 3
5 6 C 4
如果您不关心顺序,请使用此表格:
UPDATE mytable
SET line_pattern =
CASE MOD (ROWNUM, 4)
WHEN 1 THEN 8
WHEN 2 THEN 5
WHEN 3 THEN 3
WHEN 0 THEN 2
END
如何使用给定的重复数字序列更新行。 我的table如下
line_type | line_val | line_pattern |
---|---|---|
A | 1 | null |
A | 2 | null |
B | 5 | null |
B | 6 | null |
C | 3 | null |
C | 4 | null |
现在我想用 8532 的重复模式更新列值 所以更新后的 table 看起来像
line_type | line_val | line_pattern |
---|---|---|
A | 1 | 8 |
A | 2 | 5 |
B | 5 | 3 |
B | 6 | 2 |
C | 3 | 8 |
C | 4 | 5 |
如何在更新语句中实现这一点?
根据您提供的数据无法满足您的要求。 table 中的数据未按特定顺序存储。如果你想在select语句中保证顺序,你需要提供一个ORDER BY
子句。
在下面的代码中有一个额外的列“ORDER_BY”来指定需要处理记录的顺序。使用 MOD
函数计算重复模式,将行号转换为 4 个数字的重复序列,然后 CASE
将这些数字中的每一个映射到其各自的模式位置。
WITH test_data (order_by, line_type, line_val)
AS
(
SELECT 1, 'A',1 FROM DUAL UNION ALL
SELECT 2, 'A',2 FROM DUAL UNION ALL
SELECT 3, 'B',5 FROM DUAL UNION ALL
SELECT 4, 'B',6 FROM DUAL UNION ALL
SELECT 5, 'C',3 FROM DUAL UNION ALL
SELECT 6, 'C',4 FROM DUAL
)
SELECT
CASE MOD(ROW_NUMBER() OVER (ORDER BY order_by),4)
WHEN 1 THEN 8
WHEN 2 THEN 5
WHEN 3 THEN 3
WHEN 0 THEN 2
END as line_pattern,
t.*
FROM
test_data t
LINE_PATTERN ORDER_BY L LINE_VAL
------------ ---------- - ----------
8 1 A 1
5 2 A 2
3 3 B 5
2 4 B 6
8 5 C 3
5 6 C 4
如果您不关心顺序,请使用此表格:
UPDATE mytable
SET line_pattern =
CASE MOD (ROWNUM, 4)
WHEN 1 THEN 8
WHEN 2 THEN 5
WHEN 3 THEN 3
WHEN 0 THEN 2
END