2016-04-18 10 views
-2
S.NO  id  Pid 
1  123  PAQ123 
2  433  WSD3FF 
3  565  PAS45E 
4  123  PAQ123X 
5  433  WSD3FFY 
6  123  PAQ123Z

Angenommen, die obigen Beispieldatensätze sind in der Datenbank enthalten.Abrufen von Datensätzen aus einer bestimmten Spalte in Oracle

Jetzt möchte ich in der Datenbank herausfinden, ob es irgendein Wort gibt (Beispiel PAQ123), das sich mit einigen Präfixen/Suffixen wie in (PAQ123X, PAQ123Z) wiederholt.

Wie kann ich eine Abfrage schreiben, die in das obige Listen-Szenario führen würde?

+1

'wählen * aus der_Tabelle, wo pid wie 'PAQ123%''? –

+0

PAQ123 sollte dynamisch sein. das ist nur ein Beispiel – Pradeep

+0

@Pradeep: Was meinst du mit dynamic? Was kann anders sein? Wie? Versuchen Sie 'SELECT * FROM Tabelle WHERE PID REGEXP_LIKE '^ [AZ] + [0-9] +. *'' –

Antwort

0

Oracle-Setup:

CREATE TABLE table_name (S_NO, id, Pid) AS 
SELECT 1, 123, 'PAQ123' FROM DUAL UNION ALL 
SELECT 2, 433, 'WSD3FF' FROM DUAL UNION ALL 
SELECT 3, 565, 'PAS45E' FROM DUAL UNION ALL 
SELECT 4, 123, 'PAQ123X' FROM DUAL UNION ALL 
SELECT 5, 433, 'WSD3FFY' FROM DUAL UNION ALL 
SELECT 6, 123, 'PAQ123Z' FROM DUAL; 

Abfrage:

SELECT * 
FROM (
    SELECT t.*, 
     (SELECT COUNT(*) 
      FROM table_name x 
      WHERE t.id = x.id 
      AND LENGTH(t.Pid) < LENGTH(x.pid) 
      AND INSTR(x.Pid, t.Pid) = 1) AS num_matches 
    FROM Table_name t 
) 
WHERE num_matches > 0; 

Ausgang:

 S_NO   ID PID  NUM_MATCHES 
---------- ---------- ------- ----------- 
     1  123 PAQ123   2 
     2  433 WSD3FF   1 

Wenn Sie das erhalten möchten Spiele dann können Sie eine Sammlung verwenden:

CREATE TYPE stringlist AS TABLE OF VARCHAR2(100); 
/

Abfrage:

SELECT * 
FROM (
    SELECT t.*, 
     CAST(
      MULTISET(
      SELECT PID 
      FROM table_name x 
      WHERE t.id = x.id 
      AND LENGTH(t.Pid) < LENGTH(x.pid) 
      AND INSTR(x.Pid, t.Pid) = 1 
      ) 
      AS stringlist 
     ) AS matches 
    FROM Table_name t 
) 
WHERE matches IS NOT EMPTY; 

oder (da ich bin nicht sicher, MULTISET in 10g):

SELECT * 
FROM (
    SELECT t.*, 
     CAST(
      ( 
      SELECT COLLECT(PID) 
      FROM table_name x 
      WHERE t.id = x.id 
      AND LENGTH(t.Pid) < LENGTH(x.pid) 
      AND INSTR(x.Pid, t.Pid) = 1 
      ) 
      AS stringlist 
     ) AS matches 
    FROM Table_name t 
) 
WHERE matches IS NOT EMPTY; 

Ausgabe

 S_NO   ID PID  MATCHES 
---------- ---------- ------- ------------------------------------ 
     1  123 PAQ123 TEST.STRINGLIST('PAQ123X','PAQ123Z') 
     2  433 WSD3FF TEST.STRINGLIST('WSD3FFY') 
Verwandte Themen