2017-03-11 3 views
0

次の状況が発生しました: テーブルoとプロダクトpがマルチセレクトリストで接続されています。PL/SQL:INSTR()、SUBSTR()、マルチセレクトリストから値を抽出する方法

製品P:

  • プライマリキーORDER_ID何かを: "9.25"

受注Oのような価格を購入する "101"

  • 店のような

    • プライマリキーPRODUCT_ID何か"123456"のように
    • ストアすべて以下のように1列の名前はprodでuded製品 ":101:199:250:999:"
    • 店舗の列に含まれるすべてのユニット価格のような名前の値段 ":10.0:25.0:30.5:125.25:"

    たとえば123456のように、4つの製品が含まれています。 ID 101で製品を(購入価格は9.25$ている間)10.0$用に販売され、ID 199を持つ製品が25.0$のために売却されたというように...

    たので、私にとって最も困難な部分は、複数選択から必要な値を抽出することですリスト。

    注文商品に応じた価格を抽出するにはどうすればよいですか?「id = 999の商品の平均販売価格はいくらですか?値の位置を返すように

    SELECT MOD(INSTR(o.products, ':999:'),3) FROM orders o; 
    

    は、私はすでにのようなものを試してみました。

    私はPL/SQLプログラマーではないので、私はこの問題をどのように続けるか分かりません... アイデアを歓迎します。

  • +4

    最初に1つの列に複数の区切り値を格納しないでください。 –

    +0

    これについて知っています.... order_idとproduct_idのキーで3番目のテーブルを使用する方が効率的です。それにもかかわらず、ソリューションは複数選択リストに基づいている必要があります.... -/ – BPdone

    +1

    これは動作しません。私はこの上の賢い人々が機能するいくつかの機能的なコードを提供できると確信しています。一度システムを拡張しようとすると問題になります。実際の答えはデザインを修正することです。 – BobC

    答えて

    0

    以下のクエリを大きなクエリで使用できます。あるいは、それを使ってデータを正規化することができます。または両方のために。

    同じ数のトークンを持つ2つのコロンで区切られた文字列(これは、最初に通常の形式でテーブルを持つ100以上の理由の1つです)を担当しています。

    with 
        orders (order_id, prod, prices) as (
         select 123456, ':101:99:250:999:', ':10.0:25.0:30.5:125.25:' from dual union all 
         select 1003 , ':101:999:'  , ':9.95:130.40:'   from dual 
        ) 
    select order_id, 
         to_number(substr(prod, instr(prod, ':', 1, level) + 1, 
          instr(prod, ':', 1, level + 1) - instr(prod, ':', 1, level) - 1)) as prod_id, 
         to_number(substr(prices, instr(prices, ':', 1, level) + 1, 
          instr(prices, ':', 1, level + 1) - instr(prices, ':', 1, level) - 1)) as price 
    from orders 
    connect by level <= length(prod) - length(replace(prod, ':')) - 1 
         and prior order_id = order_id 
         and prior sys_guid() is not null 
    ; 
    
    ORDER_ID PROD_ID PRICE 
    -------- ------- ------ 
        1003  101 9.95 
        1003  999 30.4 
        123456  101  10 
        123456  99  25 
        123456  250 30.5 
        123456  999 125.25 
    
    関連する問題