问题: 使用以下逻辑在表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;
答案 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
填充它。