2013-03-15 72 views
0

我面對奇怪的場景分離含有VARCHAR digits這裏我需要匹配用逗號oracle中分離出的含VARCHAR位數的整數的整數如何匹配用逗號在Oracle

實施例:

表T1:

 
id integer 
key integer 

表T2

 
id integer, 
keys varchar2 

T1值是:

 
1,111 
2,201 
3,301 

T2值:

 
1, "111,301" 
2, "111,201" 
3, "201,301" 

問題:有沒有什麼辦法可以匹配或規則表示比賽與T2的鍵T1的關鍵?

+0

您不應該將逗號分隔值存儲在單個列中。 – 2013-03-15 11:08:58

+0

@kattashri a_horse_with_no_name有一個點。您必須儘快更改數據庫。拆分字段「鍵」,並將每個鍵放在一個單獨的記錄(整數類型字段)。您將在未來的時間避免許多問題。 – knagaev 2013-03-15 11:30:52

回答

1

你可以不用正則表達式常規連接此:

select * 
    from t1 
     inner join t2 
       on ','||t2.keys||',' like '%,'||to_char(t1.key)||',%'; 

如:

SQL> create table t1(id, key) 
    2 as 
    3 select 1, 111 from dual union all 
    4 select 2, 201 from dual union all 
    5 select 3, 301 from dual; 

Table created. 

SQL> create table t2(id, keys) 
    2 as 
    3 select 1, '111,301' from dual union all 
    4 select 2, '111,201' from dual union all 
    5 select 3, '201,301' from dual; 

Table created. 

SQL> select * 
    2 from t1 
    3   inner join t2 
    4     on ','||t2.keys||',' like '%,'||to_char(t1.key)||',%'; 

     ID  KEY   ID KEYS 
---------- ---------- ---------- ------- 
     1  111   1 111,301 
     1  111   2 111,201 
     2  201   2 111,201 
     2  201   3 201,301 
     3  301   1 111,301 
     3  301   3 201,301 

6 rows selected. 

這不是正則表達式,只是連接。例如,假設我們想比較

KEY KEYS 
111 111,301 

我們可以說

where keys like '%'||key||'%' 

即擴大,這是

where '111,301' like '%111%' 

它匹配的罰款。但我也在那裏添加了一些逗號。即我這樣做:

where ',111,301,' like '%,111,%' 

爲什麼?想象一下,而不是你有這樣的數據:

KEY KEYS 
111 1111,301 

如果我們做了簡單的連接:

where '1111,301' like '%111%' 

它會錯誤地匹配。通過兩側注射開頭和結尾的逗號:

where ',1111,301,' like '%,111,%' 

不再錯誤地匹配,因爲,1111,不喜歡,111,

+0

非常感謝DazzaL。它完全解決了。但是,你能詳細解釋一下,還是在你的查詢中分享一些關於正則表達式匹配的鏈接 – kattashri 2013-03-15 10:29:40

+0

@kattashri爲你添加了一些關於爲什麼我注入逗號的細節。它不是正則表達式,只是一個簡單的'LIKE'加入 – DazzaL 2013-03-15 11:07:36

+0

那麼在T2中很好看的寬度對齊字符串中的零填充數字如「4」,「004,401」'怎麼樣? – 2013-03-15 12:12:35