Настройка 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')
'select * from the_table где pid как 'PAQ123%''? –
PAQ123 должен быть динамическим. это просто пример – Pradeep
@Pradeep: Что вы подразумеваете под динамикой? Что может быть иначе? Как? Попробуйте 'SELECT * FROM table WHERE pid REGEXP_LIKE '^ [AZ] + [0-9] +. *'' –