我们有一个具有列TOTAL_MONTHS的表,例如如果
如下表所示,需要使用更新语句进行更新。
TOTAL_ MONTHS=15;月份<12〃=12和更新名为"0"的列;月份>12〃=3
下表中的另一个例子是TOTAL_ MONTHS=8;月份<12〃=8和名为"8"的更新列;月份>12〃=0
标题 | 金额Total_months | 月数<12个月;12 | ||||
---|---|---|---|---|---|---|
10101288 | 28000 | 15 | 12 | 3 | ||
10101289 | 40000 | 13 | 12 | 1 | ||
110101290 | 2000000 | 10 | 10 | |||
110101291 | 5000 | 1412 | ||||
110101239 | 6000 | 11 | <11>0 | |||
110101240 | 5000 | 8 | 8 | 0 | ||
10121003 | 690 | 12 | 12 | 0 |
使用LEAST
和GREATEST
:
update test3
set "Months<=12" = LEAST(total_months, 12),
"Months>12" = GREATEST(total_months - 12, 0);
当然,CASE
表达式也可以做到这一点。
演示:https://dbfiddle.uk/wB89f9eN
顺便说一句,我认为将这些计算值存储在公共表列中不是一个好主意。不要在数据库中冗余存储数据。如果有一天你发现一行包含total_months=15,这意味着什么;月份<12〃=12;月份>12〃=10?哪个值正确,哪个不正确?如果为了方便起见,您希望看到类似于表列的结果,请使用生成的列或视图。
如果您想将月份计算为全年和部分年,或者最多计算一年和一年以上,那么您可以计算这些值,并且不需要在数据库中有单独的列,因为这些列会有不同步的风险。
如果您确实想表示表中的值,那么您可以使用虚拟列:
CREATE TABLE "TEST3"(
TITLE VARCHAR2(100 BYTE),
AMOUNT NUMBER,
Total_Months NUMBER,
Full_Year_Months NUMBER
GENERATED ALWAYS AS (Total_months - MOD(total_months, 12)),
Part_Year_Months NUMBER
GENERATED ALWAYS AS (MOD(total_months, 12)),
"Month>12" NUMBER
GENERATED ALWAYS AS (GREATEST(total_months-12,0)),
"Month<=12" NUMBER
GENERATED ALWAYS AS (LEAST(total_months,12))
);
对于样本数据:
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101288', 28000,15);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101289', 40000,13);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101290',2000000,10);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101291', 50000,14);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101239', 6000,11);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10101240', 50000, 8);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('10121003', 690,12);
Insert into TEST3 (TITLE,AMOUNT,Total_Months) values ('12345678',1234567,45);
然后该表包含:
金额;12月<12