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

上記がデータベースのサンプルレコードであるとします。oracleの特定の列からレコードを取得します。

ここでは、(PAQ123X、PAQ123Z)のような接頭辞/接尾辞を繰り返している単語(例PAQ123)があるかどうかを調べたいと思います。

上記のリストシナリオになるクエリを作成するにはどうすればよいですか?

+1

'select * from the_tableここで、 'PAQ123%'のようなpidはありますか? –

+0

PAQ123は動的である必要があります。それはただの例です – Pradeep

+0

@Pradeep:動的ではどういう意味ですか?何が違うのでしょうか?どうやって? –

答えて

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は、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; 

出力を

 S_NO   ID PID  MATCHES 
---------- ---------- ------- ------------------------------------ 
     1  123 PAQ123 TEST.STRINGLIST('PAQ123X','PAQ123Z') 
     2  433 WSD3FF TEST.STRINGLIST('WSD3FFY') 
関連する問題