テーブルの構造が悪いと思います。ドメインごとに行が必要です。それは初心者にとって解決策を非常に困難にするでしょう。
に格納されている各ドメインの行を作成する sql が必要です。区切られたリスト。
だから dublin.ie;montreal.com;paris.com;bristol.uk
になります:-
dublin.ie
montreal.com
paris.com
bristol.uk
次に、.com を持たない行を単一の行にバインドして、取得します
dublin.ie; bristol.uk
同様の問題がありました-コンマで区切られた国コードを含むフィールドがあります。私が働いていたレポートユーザーは、国名を欲しがっていました。国コードと国名を含むCOUNTRYテーブルがありましたが、カンマ区切りのリストはそれに参加しませんでしたの上。
コンマで区切られた値ごとに (メモリ内に) 行を作成し、これらの行を COUNTRY テーブルに結合し、国の名前を返し、国名を次のように 1 行に戻すことでこれを解決しました。
「イギリス、フランス、イタリア」。
これが私が使用したコードです - ただし、初心者向けではありません。REPLACE と INSTR と SUBSTR を試してみたいと思うかもしれませんが、各フィールドに含まれるエントリの数を事前に知っておく必要があります。それ以外の場合は、おそらく PLSQL を使用してループ内で作業する必要があります。
もし私があなたなら、(可能であれば) DBA にデータを適切に構造化して、フィールドに値の配列ではなくアトミック値が含まれるように依頼します。
SELECT ROW_SPLIT.CONTRACT_ID,
WM_CONCAT(ROW_SPLIT.COUNTRY_NAME) AS COUNTRY_LIST
FROM
(SELECT PQ.ID AS CONTRACT_ID,
PQ.COUNTRY_CODE,
COUT.TEXT AS COUNTRY_NAME
FROM
(SELECT ID,
extract(value(d), '//row/text()').getStringVal() AS COUNTRY_CODE
FROM
(SELECT ID,
XMLTYPE('<rows><row>'
|| REPLACE(EXCLUDED_NATIONALITIES, ',', '</row><row>')
|| '</row></rows>') AS xmlval
FROM PROPERTY_CONTRACT
) x,
TABLE(xmlsequence(extract(x.xmlval, '/rows/row'))) d
) PQ
JOIN COUNTRY C
ON C.CODE = PQ.COUNTRY_CODE
LEFT OUTER JOIN TEXT COUT
ON C.CODE = COUT.CODE
AND COUT.CATEGORY = 'COUNTRY'
AND COUT.LANGUAGE = 'en'
ORDER BY PQ.ID,
COUT.TEXT
) ROW_SPLIT
GROUP BY ROW_SPLIT.CONTRACT_ID;