2013-03-15 68 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