从类型表中选择值

时间:2012-09-30 04:31:04

标签: collections plsql

我创建了一个定义表T_DEFINITION 该表有2列:category_id和included_service_list。 / *有很多列像INCLUDED_SERVICE_LIST逻辑一样工作,所以我写了其中一个来使问题变得简单* / 表的样本是:

CATEGORY_ID    INCLUDED_SERVICE_LIST
18             24,37,86,102,125,144,226,285
24             12,25,33,49,52,55,58,63,69,70,80,90,107

和值继续这样。

在我的选择陈述中;我想查询INCLUDED_SERVICE_LIST列:

SELECT * 
FROM T_TRANSACTION A,T_DEFINITION B
WHERE A.SERVICE_ID IN (string.split(B.INCLUDED_SERVICE_LIST))             

我需要在INCLUDED_SERVICE_LIST列中拆分字符串并在select语句中使用它。 string.split是我的自定义拆分函数,它返回一个varchar2表。

但我不知道如何从varchar2的输出表中选择值。 你能帮帮我吗?

由于

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT * 
  FROM T_TRANSACTION A,T_DEFINITION B
 WHERE A.SERVICE_ID IN (SELECT COLUMN_VALUE
                          FROM TABLE(string.split(B.INCLUDED_SERVICE_LIST)))

如果您的string.split被定义为返回嵌套表格,那么这应该有效

/* Type definition */
TYPE T_VARCHARS IS TABLE OF VARCHAR2(1000);

/* Function definition */
FUNCTION split(v VARCHAR2) RETURNING T_VARCHARS;

实际上,如果你使用的是oracle 11g,你可以创建包含嵌套表的列,而不是逗号连接数字的长变量 - 下面是这种设计的一个例子。

/* Create user type */
CREATE OR REPLACE TYPE T_NUMBERS AS TABLE OF NUMBER(30);

/* Create table with column holding a nested table */
CREATE TABLE T_DEFINITION (
    CATEGORY_ID NUMBER,
    INCLUDED_SERVICE_LIST T_NUMBERS
) NESTED TABLE INCLUDED_SERVICE_LIST STORED AS T_DEF_SERVICE_LIST;