【问题标题】:Oracle SQL - Joining list of values to a field with those values concatenatedOracle SQL - 将值列表连接到连接这些值的字段
【发布时间】:2013-10-25 15:09:35
【问题描述】:

标题有点混乱,所以我会用一个例子来解释我要做什么。

我有一个名为“修饰符”的字段。这是一个包含每个人的串联值的字段。例如,一行中的值可能是:

*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:我意识到我可以使用正则表达式并执行一堆 or 语句来搜索 MOD 列表中的逗号分隔值,但是有更好的方法吗?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    一种方法是使用 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

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

    【讨论】:

    • 感谢您的回复。我会试试这个而不是使用正则表达式。
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多