0

我创建了一个定义表,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 的输出表中选择值。你可以帮帮我吗?

谢谢

4

1 回答 1

0

Try this:

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

This should work if your string.split is defined to return a nested table - something like this

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

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

Actually, if you are using oracle 11g, you can create columns that hold nested tables, instead of long varchars of comma-joined numbers - below is an example of such design.

/* 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;
于 2012-09-30T21:26:51.573 回答