作者:黄军敬
1.下面先以对比方式介绍一下三种集合类型特征(其中LIST和SEQUENCE指的是同一种类型,只是名称不同)
TYPE |
DESCRIPTION |
DEFINITION |
INPUT DATA |
STORED DATA |
SET |
不允许重复 数据先按照定义的类型顺序 再按照从小到大的顺序存储 |
col_name SET VARCHAR(20) |
{'c','c','c','b','b', 'a'}
|
{'a','b','c'} |
col_name SET (int,VARCHAR(20)) |
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'} {3,3,2,'d',2,1,0,'c','c', 3,5,'b','b','a'} |
{0,1,2,3,'a','b','c'} {0, 1, 2, 3, 5, 'a', 'b', 'c', 'd'} |
||
MULTISET |
允许重复 数据先按照定义的类型顺序 再按照从小到大的顺序存储 |
col_name MULTISET VARCHAR(20)
|
{'c','c','c','b','b', 'a'} |
{'a','b','b','c','c','c'} |
col_name MULTISET (int, VARCHAR(20)) |
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'} {3,3,2,'d',2,1,0,'c','c', 3,5,'b','b','a'} |
{0,1,2,2,3,3,3,'a','b','b', 'c','c','c'} {0, 1, 2, 2, 3, 3, 3, 5, 'a', 'b', 'b', 'c', 'c', 'd'} |
||
LIST SEQUENCE |
允许重复 数据按输入顺序存储 |
col_name LIST VARCHAR(20)
|
{'c','c','c','b','b', 'a'} |
{'c','c','c','b','b','a'} |
col_name LIST (int, VARCHAR(20))
|
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'} {3,3,2,'d',2,1,0,'c','c', 3,5,'b','b','a'} |
{3,3,3,2,2,1,0,'c','c','c','b','b', 'a'} {3, 3, 2, 'd', 2, 1, 0, 'c', 'c', 3, 5, 'b', 'b', 'a'} |
集合类型数据具有如下特点
1) 以一对大括号”{}”作为起始标志,元素与元素之间用逗号”,”分割.
2) 集合内部支持多种数据类型,例如set(int, char(1),date)
3) 集合内部也支持用户自定义类型,如以已存在的表作为数据类型
例如
Create table t1 (t int)
Create table t2 (t set t1)
2. 集合类型之间是支持类型转换的,具体参考下表
|
TO |
|||
FROM |
|
SET |
MULTISET |
LIST |
SET |
- |
O |
O |
|
MULTISET |
O |
- |
O |
|
LIST |
O |
O |
- |
3 举例
1) SET
csql> CREATE TABLE set_tbl ( col_1 set(int, CHAR(1))); csql> INSERT INTO set_tbl VALUES ({3,3,3,2,2,1,0,'c','c','c','b','b','a'}); csql> INSERT INTO set_tbl VALUES ({NULL}); csql> INSERT INTO set_tbl VALUES ({''}); csql> SELECT * FROM set_tbl; csql> ;xr
=== <Result of SELECT Command in Line 1> === col_1 ====================== {0, 1, 2, 3, 'a', 'b', 'c'} {NULL} {' '}
csql> SELECT CAST(col_1 AS MULTISET), CAST(col_1 AS LIST) FROM set_tbl; csql> ;xr
=== <Result of SELECT Command in Line 1> ===
cast(col_1 as multiset) cast(col_1 as sequence) ============================================ {0, 1, 2, 3, 'a', 'b', 'c'} {0, 1, 2, 3, 'a', 'b', 'c'} {NULL} {NULL} {' '} {' '}
csql> INSERT INTO set_tbl VALUES (''); ERROR: Cannot coerce '' to type set. ERROR: Incompatible data type on attribute col_1. |
2) MULTISET
csql> CREATE TABLE multiset_tbl ( col_1 multiset(int, CHAR(1))); csql> INSERT INTO multiset_tbl VALUES ({3,3,3,2,2,1,0,'c','c','c','b','b', 'a'}); csql> SELECT * FROM multiset_tbl; csql> ;xr
=== <Result of SELECT Command> === col_1 ====================== {0, 1, 2, 2, 3, 3, 3, 'a', 'b', 'b', 'c', 'c', 'c'}
csql> SELECT CAST(col_1 AS SET), CAST(col_1 AS LIST) FROM multiset_tbl; csql> ;xr
=== <Result of SELECT Command in Line 1> ===
cast(col_1 as set) cast(col_1 as sequence) ============================================ {0, 1, 2, 3, 'a', 'b', 'c'} {0, 1, 2, 2, 3, 3, 3, 'a', 'b', 'b', 'c', 'c', 'c'} |
3) LIST or SEQUENCE
csql> CREATE TABLE list_tbl ( col_1 list(int, CHAR(1))); csql> INSERT INTO list_tbl VALUES ({3,3,3,2,2,1,0,'c','c','c','b','b', 'a'}); csql> SELECT * FROM list_tbl; csql> ;xr
=== <Result of SELECT Command in Line 1> === col_1 ====================== {3, 3, 3, 2, 2, 1, 0, 'c', 'c', 'c', 'b', 'b', 'a'}
csql> SELECT CAST(col_1 AS SET), CAST(col_1 AS MULTISET) FROM list_tbl; csql> ;xr
=== <Result of SELECT Command in Line 1> === cast(col_1 as set) cast(col_1 as multiset) ============================================ {0, 1, 2, 3, 'a', 'b', 'c'} {0, 1, 2, 2, 3, 3, 3, 'a', 'b', 'b', 'c', 'c', 'c'} |