Oracle SQL - 将值列表连接到具有这些值连接的字段

时间:2013-10-25 02:25:18

标签: sql oracle

标题有点令人困惑,所以我将用一个例子来解释我正在尝试做什么。

我有一个名为“修饰符”的字段。这是一个具有每个人的连接值的字段。例如,一行中的值可以是:

*26,50,4                 *

和下一行的值

*4                       *

表格(表A)看起来像这样:

Key    Modifier
1      *26,50,4                 *
2      *4                       *
3      *1,2,3,4                 *

星号总是处于同一位置(此处为1和26),中间数字不确定,以逗号分隔。

我想要做的是将“修饰符”字段“加入”另一个表(表B),其中包含该修饰符的可能值列表。例如,该表可能如下所示:

ID         MOD
1          26
2          3
3          50
4          78

如果A.modifier中的值出现在B.mod中,我想在表A中保留该行。否则,请将其保留。 (我松散地使用术语“加入”,因为我不确定这是我需要的。)

这可能吗?我该怎么做?

提前致谢!

编辑1:我意识到我可以使用正则表达式并执行一堆或语句来搜索MOD列表中逗号分隔的值,但是有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

一种方法是使用TRIM,字符串连接和LIKE。

SELECT *
FROM tableA a
WHERE EXISTS(
   SELECT 1 FROM tableB b
   WHERE   
       ','|| trim( trim( BOTH '*' FROM a.Modifier )) ||','
       LIKE  '%,'|| b.mod || ',%'
);

演示 - > http://www.sqlfiddle.com/#!4/1caa8/10

这个查询对于大型表来说仍然很慢(它总是执行对表或索引的完全扫描),但它应该比使用正则表达式或将逗号分隔列表解析为单个值更快。