Oracle 12c - 根据不同表中的值动态生成 where 子句

Posted

技术标签:

【中文标题】Oracle 12c - 根据不同表中的值动态生成 where 子句【英文标题】:Oracle 12c - dynamically generate a where clause based on a value in a different table 【发布时间】:2016-09-29 02:15:50 【问题描述】:

我正在尝试编写这样的 Oracle 12c SQL 语句:

select * from table1 where col1 in (*dynamicvalue*)

我希望动态值是以下 SQL 的结果:

select col2 from table2 where rowid = 1

这可能吗? Col2 包含如下值的列表:'val1','val2','val3'

谢谢

【问题讨论】:

第二个查询的结果不是一个列表。你应该看看joins。这里不需要动态sql。 可能我的措辞不正确,Col2 的单条记录是这样的值列表:'val1','val2','val3' 可能与this post重复 你应该修复你的数据结构,所以列表不会存储在单个列中。 【参考方案1】:

您可以拆分字符串并执行查询,而不是 dynamic-sql。要拆分字符串,请使用regexp_substr

select * from table1 
where col1 in (select regexp_substr(col2,'[^,]+', 1, level)  
               from table2
               connect by regexp_substr(col2, '[^,]+', 1, level) is not null)

【讨论】:

谢谢!我认为这是正确的道路。有没有办法使用动态 SQL 呢? 我不知道用 dynamic-sql 做这个的方法。 @AAA - “也使用动态 SQL”是什么意思?恐怕您不会在既定的技术意义上使用“动态”一词。您是否正在寻找变量表或列名?如果没有,您不想要“动态”SQL;与其使用大词,不如用简单明了的英语单词来解释你想要什么。【参考方案2】:

为什么不这样做呢?

select t1.*
from table1 t1
where t1.col1 in (select col2 from table2 where rowid = 1);

编辑:

将值列表存储在单个列中是一个糟糕的主意,以至于我错误地解释了这个问题。我将“值列表”作为存储在 不同 行中的值。为什么?因为这是存储数据的正确方法。将列列表存储在分隔列表中不是 SQLish。

也就是说,我们有时会被其他人非常糟糕的设计决策所困扰。如果您处于这种情况,您可以使用这样的查询:

select t1.*
from table1 t1
where exists (select 1
              from table2 t2
              where rowid = 1 and
                    ',' || t2.col2 || ',' like '%,' || t1.col1 || ',%'
             );

【讨论】:

我相信 OP 的意思是 col2 是一个包含 'val1', 'val2', 'val3' 的字符串 - 即他希望查询以 SELECT * FROM TABLE1 WHERE COL1 IN ('val1', 'val2', 'val3') 执行 - 或者至少我是这么读的。 YMMV。 :-) @BobJarvis 。 . .这很有意义。我将其解释为每一行的单个值。

以上是关于Oracle 12c - 根据不同表中的值动态生成 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 12c - 使用表中的值构建选择语句

Oracle12C部署服务建立用户及建库建表中遇到的问题以及12C的一些新特性

如何根据oracle中另一个表中的值更新一个表中的字段[重复]

oracle中update怎样同时更新一个表中几个字段的值

oracle如何根据另一张表中的一行的值来选择一列

如何使用间隔 1 分钟在两个日期之间将时间序列数据生成到 Oracle PL/SQL 中的表中?