2017-09-28 23 views
0

idkこれについて正しい質問をするにはどうすればよいですか、ここでは、ランクで特定の単語を表示する方法は?

私はこのmy_tableを持っています。 INFO STARTとINFO ENDの間に1つのレートを表示する必要があります。

RATE: 
1. BEST 
2. BETTER 
3. GOOD 

私は「より良い」とINFO STARTとEND INFOの範囲内で「良い」の両方を持っているのであれば、私は代わりに「良い」の「より良い」を表示します。そして、「最高」がそこにあるなら最高であることを「最高」。

MY_TABLE

RNUM VAL 
    1 game of thrones 
    2 electric fan 
    3 INFO START 
    4 name: polo 
    5 white 
    6 better 
    7 slacks 
    8 tv 
    9 good 
    10 INFO END 
    11 keyboard 
    12 guitar 
    13 INFO START 
    14 name: mirror 
    15 best 
    16 good 
    17 better 
    18 INFO END 
    19 INFO END 
    20 INFO END 
    21 bag 
    22 INFO START 
    23 name: monitor 
    24 music 
    25 best 
    26 telephone 
    27 INFO END 
    28 INFO END 
    29 ADFASD 

私の予想出力

NAME   RATE   
POLO   BETTER   
MIRROR  BEST    
MONITOR  BEST 

これまでのところ、私は名前や料金を見つける必要がありINFO STARTとEND INFOの範囲を得ることができます。

my code;

declare 
    v_rnum varchar2(50); 
    v_val varchar2(50); 
    v_r_end varchar2(50); 
begin 

for i in (with t1 as (select rownum rnum_new, a.* 
       from (select * 
         from samp2 
        where val like '%INFO START%' 
        union 
        select * 
         from samp2 
        where val like '%INFO END%')A 
      ORDER BY RNUM ASC) 
      select a.*, b.rnum rnum_end 
       from t1 a inner join t1 b 
       on a.rnum_new + 1 = b.rnum_new 
      where a.val like '%INFO START%') 
loop 
    dbms_output.put_line(i.rnum ||' ' || i.val|| ' '|| i.rnum_end); 
end loop; 
end; 

相続人は、その出力は、(私はこれまでのテストのためにDBMS_OUTPUT使用しかし、私はそれをテーブルに挿入されます後で 場合、私は右の率を得ることができます)

3 INFO START 10 
13 INFO START 18 
22 INFO START 27 

ので、任意のアイデアはどのように表示します料金は?私は私のランク()ここで私の料金のために使用することができると思うが、私はこの事でそれを使用するには慣れていない。あなたはそれをする方法や提案を持っていますか? rank()またはこれを解決できるスタイル。ありがとう!あなたが私の英語を理解して欲しいです。

は、ここでは、このコードを使用することができます

CREATE TABLE samp (
    val varchar(50) 
); 
INSERT INTO samp (val) VALUES ('game of thrones'); 
INSERT INTO samp (val) VALUES ('electric fan'); 
INSERT INTO samp (val) VALUES 
('INFO START'); 
INSERTINSERT INTO samp (val) VALUES 
('Name: Polo'); 
INSERT INTO samp (val) VALUES 
('White'); 
INSERT INTO samp (val) VALUES 
('Better'); 
INSERT INTO samp (val) VALUES 
('Slacks'); 
INSERT INTO samp (val) VALUES 
('Tv'); 
INSERT INTO samp (val) VALUES 
('Good'); 
INSERT INTO samp (val) VALUES 
('INFO END'); 
INSERT INTO samp (val) VALUES 
('keyboard'); 
INSERT INTO samp (val) VALUES 
('Guitar'); 
INSERT INTO samp (val) VALUES 
('INFO START'); 
INSERT INTO samp (val) VALUES 
('Name: Mirror'); 
INSERT INTO samp (val) VALUES 
('Best'); 
INSERT INTO samp (val) VALUES 
('Good'); 
INSERT INTO samp (val) VALUES 
('Better'); 
INSERT INTO samp (val) VALUES 
('INFO END'); 
INSERT INTO samp (val) VALUES 
('INFO END'); 
INSERT INTO samp (val) VALUES 
('INFO END'); 
INSERT INTO samp (val) VALUES 
('Bag'); 
INSERT INTO samp (val) VALUES 
('INFO START'); 
INSERT INTO samp (val) VALUES 
('Name: Monitor'); 
INSERT INTO samp (val) VALUES 
('music'); 
INSERT INTO samp (val) VALUES 
('best'); 
INSERT INTO samp (val) VALUES 
('telephone'); 
INSERT INTO samp (val) VALUES 
('INFO END'); 
INSERT INTO samp (val) VALUES 
('INFO END'); 
INSERT INTO samp (val) VALUES 
('ADFASD') 

答えて

0

をdb-fiddle.com使用して、私のバイオリンです。それは私が思ったよりずっと複雑でした。ここで使用されるテーブルはtest_sampです。あなたのテーブルには挿入シーケンスを識別するカラムがないので、ROWIDを使用しました。しかし、それは絶対確実ではありません。シーケンスを追跡するために別の列を追加し、FORループ内にその列を追加する必要があります。

SET SERVEROUTPUT ON; 
DECLARE 
    v_name test_samp.val%TYPE; 
    v_n  NUMBER := 0; 
    v_rate VARCHAR2 (10); 
    v_oper NUMBER := 0; 
BEGIN 

DBMS_OUTPUT.PUT_LINE ('NAME' || ' ' || 'RATE'); 
    FOR item IN ( SELECT * 
        FROM test_samp 
       ORDER BY ROWID) 
    LOOP 
     IF item.val = 'INFO START' 
     THEN 
     v_oper := 1; 
     END IF; 

     IF v_oper = 1 AND item.val LIKE 'Name: %' 
     THEN 
     v_name := 
      REGEXP_SUBSTR (item.val, 
          'Name: (.+)$', 
          1, 
          1, 
          'i', 
          1); 
     END IF; 

     IF v_oper = 1 AND UPPER (item.val) IN ('GOOD', 'BETTER', 'BEST') 
     THEN 
     WITH rating_logic 
       AS (SELECT 1 n, 'GOOD' rate FROM DUAL 
        UNION ALL 
        SELECT 2 n, 'BETTER' rate FROM DUAL 
        UNION ALL 
        SELECT 3 n, 'BEST' rate FROM DUAL) 
     SELECT GREATEST (v_n, n) 
      INTO v_n 
      FROM rating_logic r 
      WHERE UPPER(r.rate) = UPPER(item.val); 
     END IF; 

     IF item.val = 'INFO END' AND v_oper = 1 
     THEN 

     WITH rating_logic 
       AS (SELECT 1 n, 'GOOD' rate FROM DUAL 
        UNION ALL 
        SELECT 2 n, 'BETTER' rate FROM DUAL 
        UNION ALL 
        SELECT 3 n, 'BEST' rate FROM DUAL) 
     SELECT rate 
      INTO v_rate 
      FROM rating_logic r 
      WHERE r.n = v_n; 

     DBMS_OUTPUT.PUT_LINE (v_name || ' ' || v_rate); 

      v_oper := 0; 
      v_n := 0; 


     END IF; 
    END LOOP; 
END; 
/
関連する問題