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

Предположим, что приведенные выше примеры образцов в базе данных.Извлечь записи из определенного столбца в оракуле

Теперь, когда я хочу узнать в базе данных, есть ли какое-либо слово (пример PAQ123), которое повторяется с некоторыми префиксами/суффиксами, как в (PAQ123X, PAQ123Z).

Как написать запрос, который приведет к сценарию выше списка?

+1

'select * from the_table где pid как 'PAQ123%''? –

+0

PAQ123 должен быть динамическим. это просто пример – Pradeep

+0

@Pradeep: Что вы подразумеваете под динамикой? Что может быть иначе? Как? Попробуйте 'SELECT * FROM table WHERE pid REGEXP_LIKE '^ [AZ] + [0-9] +. *'' –

ответ

0

Настройка Oracle:

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; 

Запрос:

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; 

Выход:

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

Если вы хотите получить матчей, то вы можете использовать коллекцию:

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

запрос:

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; 

или (так как я не уверен, что MULTISET в 10г):

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; 

Выход

 S_NO   ID PID  MATCHES 
---------- ---------- ------- ------------------------------------ 
     1  123 PAQ123 TEST.STRINGLIST('PAQ123X','PAQ123Z') 
     2  433 WSD3FF TEST.STRINGLIST('WSD3FFY') 
Смежные вопросы