Number和varchar2的映射

时间:2014-09-17 10:20:41

标签: sql oracle

我有两张表,比如

table 1

a:varchar2(100)

100,200,300,530
125.325.526.254
125.254.325.100
100.563.100.254
278.100.215.214
125.214.685.258

table 2(number)

b:

100
200
300
400
524 

我的问题是,如果我从第二个表中提供100并且该查询应该在第一个表中显示所有出现的100

例如。我给100,输出应该是

100,200,300,530
125.254.325.100
100.563.100.254
278.100.215.214

2 个答案:

答案 0 :(得分:0)

SQL> WITH DATA1 AS(
  2  SELECT '100,200,300,530' STR FROM DUAL UNION ALL
  3  SELECT '125.325.526.254' STR FROM DUAL UNION ALL
  4  SELECT '125.254.325.100' str from dual union all
  5  SELECT '100.563.100.254' STR FROM DUAL UNION ALL
  6  SELECT '278.100.215.214' STR FROM DUAL UNION ALL
  7  SELECT '125.214.685.258' STR FROM DUAL),
  8  DATA2 AS(
  9  SELECT 100 VAL FROM DUAL UNION ALL
 10  SELECT 200 val from dual union all
 11  SELECT 300 VAL FROM DUAL UNION ALL
 12  SELECT 400 VAL FROM DUAL UNION ALL
 13  SELECT 524  VAL FROM DUAL),
 14  DATA3 AS(SELECT VAL FROM DATA2 WHERE VAL = 100)
 15  SELECT A.*
 16     FROM DATA1 A, DATA3 B
 17    WHERE REGEXP_LIKE(STR,TO_CHAR(B.VAL))
 18  /

STR
---------------
100,200,300,530
125.254.325.100
100.563.100.254
278.100.215.214

其中, data1是你的第一个有字符串的表,data2是你的第二个有数字的表。只需将data1和data2的with子句替换为表格。

更新:关于设计缺陷和规范化

从设计的角度来看,您的表格设计违反了normalization。您不应在单个列中存储多个值,并使用正确的数据类型来避免implicit data conversions。在您的情况下,您应该为'100,200,300,530'等值设置不同的列。试想一下,当您的表标准化后,列值'100,200,300,530'将如下所示:

col1 col2 col3 col4 col5
---- ---- ---- ---- ----
1    100  200  300  530

其中,col1是主键,col2,col3,col4和col5是NUMBER数据类型。

同样,您的第二个表应该是referencing第一个表。数字列变为foreign key,因此您实施referential integrity

答案 1 :(得分:-1)

您的查询将如下所示:

select * from


 (select convert(a,varchar) as A from table1) T

where T.A like '%100%'