0

SQL 初心者。Oracle sql developer バージョン 3.1.07 を使用します。次のような文字列を含む文字列列の要素を区切る方法はありますか?

dublin.ie;montreal.com;paris.com

に基づいて分割して、;個別に操作できるようにします (テーブルのすべての行に対して行います)。これは、で終わるものをすべて削除したいが.com、残りには影響を与えないためです。

私はかなり初心者で、かなり古いバージョンを使用しているため、できる限り最も基本的なSQLを使用したいと考えています。

何か案は?ありがとうございます。これまでの支援は素晴らしいものでした。

4

1 に答える 1

2

テーブルの構造が悪いと思います。ドメインごとに行が必要です。それは初心者にとって解決策を非常に困難にするでしょう。

に格納されている各ドメインの行を作成する 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;
于 2012-09-13T12:49:16.987 に答える