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'
谢谢
【问题讨论】:
第二个查询的结果不是一个列表。你应该看看join
s。这里不需要动态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 子句的主要内容,如果未能解决你的问题,请参考以下文章
Oracle12C部署服务建立用户及建库建表中遇到的问题以及12C的一些新特性