oracle sql中where条件的动态数量

Posted

技术标签:

【中文标题】oracle sql中where条件的动态数量【英文标题】:dynamic number of where condition in oracle sql 【发布时间】:2012-07-19 03:11:45 【问题描述】:

我需要为报表工具中的提示编写 sql。我得到了一个变量中的多个值的列表,用'-'分隔,这些值的数量可能会有所不同。(eg1."abc-def" eg2."abc-def-xyz")。

现在我需要用这种形式的oracle写sql(逻辑上)

select something
  from somewhere
 where someColumn in 'abc' -- use substr to extract abc
    or someColumn in 'def' -- use substr to extract def
    or ...till we don't find '-'.

我不能使用 plsql 进行查询。要么我可能不知道使用我在 plsql 中选择的变量,要么可能是报告工具不支持。

提前致谢。

【问题讨论】:

【参考方案1】:

试试

select something
  from somewhere
 where someColumn in (select regexp_substr('abc-def-xyz','[^-]+', 1, level) from dual
                     connect by regexp_substr('abc-def-xyz', '[^-]+', 1, level) is not null);

概括(考虑到您的字段用“-”分隔)

select something
  from somewhere
 where someColumn in (select regexp_substr(variable,'[^-]+', 1, level) from dual
                     connect by regexp_substr(variable, '[^-]+', 1, level) is not null);

基本上子查询的输出如下图——

  SQL> select regexp_substr('abc-def-xyz','[^-]+', 1, level) value from dual
      connect by regexp_substr('abc-def-xyz', '[^-]+', 1, level) is not null;

VALUE                            
-------------------------------- 
abc                              
def                              
xyz  

【讨论】:

【参考方案2】:

首先使用 Oracle 的 regexp_substr() 函数将字符串拆分为多个部分。请参阅regexp_substr function(如果您可以访问生成字符串的原始文件,请使用它。)

其次,把它放在一个临时表中,然后就可以了:

select something
  from somewhere
 where someColumn in (select parts from tmpTable)

【讨论】:

不需要临时表,内联视图就足够了。此外,在报告工具中使用 PLSQL 存储过程(无论如何都可以完成)填充临时表(使用用户输入)似乎是不必要的。 @Annjawn,我同意你关于临时表的观点,但他对这个太陌生了,我想让它尽可能简单和可测试。【参考方案3】:
select something
  from somewhere
 where INSTR('-'||'abc-def-ghi'||'-', '-'||someColumn||'-') > 0;

【讨论】:

【参考方案4】:

如果你只想要一个包含'-'的结果列表,你可以这样做

从某处某处选择某物,例如('%-%');

【讨论】:

我已经编辑了这个问题。你介意看一下吗?

以上是关于oracle sql中where条件的动态数量的主要内容,如果未能解决你的问题,请参考以下文章

sql 存储过程如何动态拼接where后面的条件

在数据库视图中应用动态 where 条件(oracle - 12c,mysql 5+)

oracle SQL查询中,如何在where中用条件语句,判断不同情况,追加不同的And条件?

准备好的语句中的动态 where 条件的 SQL 注入

三:动态SQL

动态 SQL Where 条件,在 Powershell 脚本中