计算声明为表的varray的列中的元素数

时间:2018-03-26 23:16:58

标签: database oracle plsql

给出下表

TYPE MYTYPE IS VARRAY(100) OF NUMBER;
CREATE TABLE EMPLOYEES(ID NUMBER(*), SALARY_HISTORY(MYTYPE) );

如何计算SALARY_HISTORY列中的元素数量,以便在该列中列出员工的所有工资?

2 个答案:

答案 0 :(得分:1)

请参阅下面演示底部的查询。我使用了您的代码,但将表命名为E,因为我已经有了一个表EMPLOYEES。请注意,SQL不是PL / SQL;要在SQL中使用您的类型,您必须使用CREATE TYPE语句。

create TYPE MYTYPE IS VARRAY(100) OF NUMBER;
/

CREATE TABLE E(ID NUMBER, SALARY_HISTORY MYTYPE );

insert into e values (1, mytype(1, 2, 3));
insert into e values (3, mytype(33, 22, 0, 33, 0));

select * from e;

ID  SALARY_HISTORY
--  ------------------------------
 1  INTRO.MYTYPE(1, 2, 3)
 3  INTRO.MYTYPE(33, 22, 0, 33, 0)

select id, count(*)
from e, table(e.salary_history)
group by id;

   ID   COUNT(*)
----- ----------
    1          3
    3          5

或者,或许(如果这是您需要的): - column_valuetable运营商生成的列的名称。

select   id, count(distinct column_value) as distinct_cnt
from     e, table(e.salary_history)
group by id;

   ID DISTINCT_CNT
----- ------------
    1            3
    3            3

答案 1 :(得分:1)

如果可能,将数据模型转换为常规关系表。大约一半的程序员都知道如何使用SQL。可能只有不到0.01%的人知道如何查询VARRAY。如果没有人知道如何查询数据库,那么数据库有什么意义呢?当您需要在历史信息中添加日期列或遇到性能问题时,您打算做什么?

如果必须使用对象关系列,嵌套表会使事情变得更简单,并避免限制元素的数量。

create or replace type mytype is table of number;

create table employees(id number(*), salary_history mytype)
   nested table salary_history store as employees_salary_history;

insert into employees values(null, null);
insert into employees values(0, mytype());
insert into employees values(1, mytype(1));
insert into employees values(2, mytype(1,2));
insert into employees values(3, mytype(1,2,3));

select id, nvl(cardinality(salary_history), 0) salary_count
from employees;

ID   SALARY_COUNT
--   ------------
                0
 0              0
 1              1
 2              2
 3              3

如果你坚持使用当前的数据模型,那么Mathguy的答案应该有效,尽管交叉连接可能会导致性能问题。