如何在in子句中使用列分隔字段

时间:2017-02-22 20:01:57

标签: sql oracle

如何在in子句

中使用列分隔字段
Table 1 (id,requestedColor) 
Data  
1     Red,Green,Black,Orannge,
2    Blue,
3    Yellow,Red,

table 2 (colorname)
Data
Red
Pink
Green

我需要找到来自table 2的给定requestedColumn的所有颜色(来自table 1)。

2 个答案:

答案 0 :(得分:2)

您无法使用IN条件执行此操作,至少不能直接执行此操作。 IN条件括号中的内容应该是几个单独字符串的列表,用逗号分隔。你的第一个表(每行)中有一个字符串 - 其中的内容(例如它包含逗号的事实)完全不相关。

有三种方法可以做到这一点。一个是 - 最好的建议 - 来修复您的数据模型。不要在一个字段中保存多个值;这违反了声表设计的绝对最低要求,称为“第一范式”。

如果失败,您可以拆分字符串,然后以正常方式使用IN

对于这个特定的练习,可能更容易有条件,如

... where ',' || table1.requestedcolor || ',' like '%,' || table2.colorname || ',%'

必须使用连接逗号来避免Red匹配Dark Red等情况。

无论您选择哪种方法(缺少正确的方法,即规范化您的表),代码都将难以读取,写入和维护,并且效率低下。没有办法绕过它。这就是为什么专业人士首先对First Normal Form如此坚定。

答案 1 :(得分:0)

同意@mathguy说的话;另一种(可能效率低下)方法是使用正则表达式进行连接:

select t2.colorname
from table1 t1
join table2 t2 on regexp_like(t1.requestedColor, '(^|,)' || t2.colorname || '(,|$)')
where t1.id = 1

COLORNAME
---------
Red
Green