0

定義テーブル T_DEFINITION を作成しました。このテーブルには、category_id と included_service_list の 2 つの列があります。/*INCLUDED_SERVICE_LIST ロジックのように機能する列がたくさんあるので、質問を簡単にするためにそのうちの 1 つを書きました*/ テーブルのサンプルは次のとおりです。

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

そして値はこのように続きます。

私のselect文では; 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

これを試して:

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 を使用している場合は、カンマ結合された数値の長い varchar の代わりに、ネストされたテーブルを保持する列を作成できます。以下はそのような設計の例です。

/* 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 に答える