0

列 TVL_CD_LIST を含む TVL_DETAIL というテーブルがあります。TVL_CD_LIST 列には 3 つのレコードが含まれています。
TVL_CD_LIST:
M1180_Z6827
K5900_Z6828
I2510

値のみを返すために次のコードを使用しました(アンダースコアを除く):

SELECT
TVL_CD_LIST   
FROM TVL_DETAIL  
WHERE TVL_CD_LIST IN (SELECT regexp_substr(TVL_CD_LIST,'[^_]+', 1, level) FROM DUAL
CONNECT BY regexp_substr(TVL_CD_LIST,'[^_]+', 1, level) IS NOT NULL)

別々の行で返されることを期待していたのは、
M1180
Z6827
K5900 Z6828
I2510
です。

ただし、I2510 (アンダースコアを含まない元の値) のみが返されます。

私は何を間違っていますか?どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

0

使用したクエリはリストを作成しますが、in句を使用してレコードのリストを列自体と比較しています。値が 1 つしかないため、一致します。M1180Z6827M1180_Z6827K5900_Z6828I2510

要件が目的の出力で言及したものとまったく同じである場合は、以下のクエリを使用できます。

SQL> WITH tvl_detail AS
      2   (SELECT 'M1180_Z6827' tvl_cd_list FROM dual
      3    UNION ALL
      4    SELECT 'K5900_Z6828' FROM dual
      5    UNION ALL
      6    SELECT 'I2510' FROM dual)
      7   ---------------------------
      8   --- End of data preparation
      9   ---------------------------
     10  SELECT regexp_substr(tvl_cd_list, '[^_]+', 1, LEVEL) AS tvl_cd_list
     11    FROM tvl_detail
     12  CONNECT BY regexp_substr(tvl_cd_list, '[^_]+', 1, LEVEL) IS NOT NULL
     13         AND PRIOR tvl_cd_list = tvl_cd_list
     14         AND PRIOR sys_guid() IS NOT NULL;

出力:

TVL_CD_LIST
--------------------------------------------
I2510
K5900
Z6828
M1180
Z6827
于 2016-12-08T09:06:10.420 に答える