IF-ELSE语句:根据另一个列

时间:2016-01-08 09:18:13

标签: sql oracle if-statement plsql sql-update

在表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之前的“;”:sometimessometimes没有),但它仍然是不工作。

IF (TEMPO_INTERCORSO = 0) THEN
Report error -
Comando sconosciuto

一些想法?

ps =我也试过了JAN07.TEMPO_INTERCORSO!

3 个答案:

答案 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会自动显示所需的值。