添加大于值的虚拟列

时间:2018-09-20 10:27:38

标签: sql oracle

问题: 使用以下逻辑在表EMPLOYEES中创建一个名为SALARY_RANGE的虚拟列。

如果薪水大于10000,则值应显示为“好”,否则值应显示为“平均”。

我的语法:

alter table EMPLOYEES
add column salary_range varchar
(where salary>10000
then salary_range='Good'
else if salary_range='Average') virtual;

2 个答案:

答案 0 :(得分:2)

要为逻辑添加带有case表达式的虚拟列:

alter table employees add salary_range varchar2(7)
generated always as (
  case when salary > 10000 then 'Good' else 'Average' end
) virtual;

或删除了the syntax的可选位,只是:

alter table employees add salary_range as (
  case when salary > 10000 then 'Good' else 'Average' end
);

Table EMPLOYEES altered.

您可以显式指定大小,但是Oracle可以从case表达式的可能结果中得出大小:

desc employees

Name           Null?    Type         
-------------- -------- ------------ 
EMPLOYEE_ID    NOT NULL NUMBER(6)    
FIRST_NAME              VARCHAR2(20) 
LAST_NAME      NOT NULL VARCHAR2(25) 
EMAIL          NOT NULL VARCHAR2(25) 
PHONE_NUMBER            VARCHAR2(20) 
HIRE_DATE      NOT NULL DATE         
JOB_ID         NOT NULL VARCHAR2(10) 
SALARY                  NUMBER(8,2)  
COMMISSION_PCT          NUMBER(2,2)  
MANAGER_ID              NUMBER(6)    
DEPARTMENT_ID           NUMBER(4)    
SALARY_RANGE            VARCHAR2(7)  

并检查生成的值:

select employee_id, first_name, last_name, salary, salary_range from employees;

EMPLOYEE_ID FIRST_NAME           LAST_NAME                     SALARY SALARY_
----------- -------------------- ------------------------- ---------- -------
        100 Steven               King                           24000 Good   
        101 Neena                Kochhar                        17000 Good   
        102 Lex                  De Haan                        17000 Good   
        103 Alexander            Hunold                          9000 Average
        104 Bruce                Ernst                           6000 Average
        105 David                Austin                          4800 Average
...

答案 1 :(得分:0)

如果使用的是Oracle 11g +,则可以将虚拟列添加为:

alter table EMPLOYEES
    add column salary_range varchar2(32) as (case when salary > 10000
then salary_range = 'Good' else salary_range = 'Average' end) virtual;

在Oracle中,我想通常会包含generated always,所以:

alter table EMPLOYEES
    add column salary_range varchar2(32) generated always as
       (case when salary > 10000
             then salary_range = 'Good' else salary_range = 'Average'
        end) virtual;

在早期版本中,您需要添加一个实列并使用update填充它。