在表JAN07中,我有一列TEMPO_INTERCORSO(数字(10,0)),我想创建另一列ANTE_POST(数字(1)),当TEMPO_INTERCORSO>时,该列为'0'。否则为0和'1'。
IF (TEMPO_INTERCORSO > 0) THEN
UPDATE JAN07 SET ANTE_POST = 1
ELSE
UPDATE JAN07 SET ANTE_POST = 0
END IF;
我尝试了很多不同的方法,你可以在网上找到(例如ELSE之前的“;”:sometimes,sometimes没有),但它仍然是不工作。
IF (TEMPO_INTERCORSO = 0) THEN
Report error -
Comando sconosciuto
一些想法?
ps =我也试过了JAN07.TEMPO_INTERCORSO!
答案 0 :(得分:6)
以下UPDATE
查询使用CASE...WHEN
来实现您的目标:
UPDATE JAN07
SET ANTE_POST = CASE WHEN TEMPO_INTERCORSO > 0 THEN 1 ELSE 0 END
答案 1 :(得分:1)
条件控制IF-THEN-ELSE STATEMENT是PL / SQL中的一个语句。 PL / SQL中的每个语句都以半色结束。因此它写得像这样:
IF condition THEN
{...statements to execute when condition is TRUE...}
ELSE
{...statements to execute when condition is FALSE...}
END IF; --semi colon at the end
在您的代码中,内部有语句 。因此,在本声明的最后必须有半冒号。您的代码可以这样写:
IF (TEMPO_INTERCORSO > 0) THEN
UPDATE JAN07 SET ANTE_POST = 1; --semi colon
ELSE
UPDATE JAN07 SET ANTE_POST = 0; --semi colon
END IF; --semi colon
一些答案已经建议在纯SQL而不是PL / SQL中执行此操作。我同意的。
答案 2 :(得分:1)
我建议在Oracle Database 11g Release 1
中推荐 Virtual Columns 。一个简单的 CASE 语句将完成其余的工作。
例如,
SQL> CREATE TABLE t
2 (
3 TEMPO_INTERCORSO NUMBER,
4 ANTE_POST NUMBER GENERATED ALWAYS AS (
5 CASE
6 WHEN TEMPO_INTERCORSO > 0
7 THEN 1
8 ELSE 0
9 END) VIRTUAL
10 );
Table created.
现在,您无需担心手动更新虚拟列,它将在运行时自动生成。
我们仅在静态列中插入值,请参阅:
SQL> INSERT INTO t(TEMPO_INTERCORSO) VALUES(0);
1 row created.
SQL> INSERT INTO t(TEMPO_INTERCORSO) VALUES(1);
1 row created.
SQL> INSERT INTO t(TEMPO_INTERCORSO) VALUES(10);
1 row created.
SQL> commit;
Commit complete.
SQL> SELECT * FROM t;
TEMPO_INTERCORSO ANTE_POST
---------------- ----------
0 0
1 1
10 1
因此,您的列ANTE_POST
会自动显示所需的值。