如何在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
)。
答案 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