【问题标题】:Dynamic where clause based on table基于表的动态where子句
【发布时间】:2021-07-30 17:16:45
【问题描述】:

我想根据表格形成一个动态的where子句。如果同一列存在 'OR' 子句必须添加,否则它必须是 'AND'。我没有做到这一点,因为当存在相同的列时它不起作用

结果

   Where = ((COL1='8715') OR (COL1 ='4100)) and ((COL2 BETWEEN 10 AND 20 ) OR (COL2 >=5))

代码:

 lv_set := 'OR'

 FOR i in 1..:lv_count
 

  DO
         if (:OPERATOR[:i] = 'EQ')
           then
                 
                lv_where =  '(' || lv_where || :FIELD[:i] || ' = ' || :LOW[:i] || ')' || :lv_set;
                
         elseif (:OPERATOR[:i] = 'BT')
           then
                lv_where = lv_where || '('  ||  :FIELD[:i] || ' BETWEEN ' || :LOW[:i] || ' AND ' || :HIGH[i] || ')' || :lv_set; 
         
         elseif (:OPERATOR[:i] = 'LT')
           then
                lv_where = lv_where || '(' || :FIELD[:i] || ' < ' || :LOW[:i] || ')' || :lv_set;
         
         elseif (:OPERATOR[:i] = 'GT')
           then
                lv_where = lv_where || '(' || :FIELD[:i] || ' > ' || :LOW[:i] || ')' || :lv_set;
         
         elseif (:OPERATOR[:i] = 'LE')
           then
                lv_where = lv_where || '(' || :FIELD[:i] || ' <= ' || :LOW[:i] || ')' || :lv_set;
         
         elseif (:OPERATOR[:i] = 'GE')
           then
                lv_where =  lv_where || '(' || :FIELD[:i] || ' >= ' || :LOW[:i] || ')' || :lv_set;
         
         end if; 
         
      END FOR;

【问题讨论】:

  • 这太疯狂了。我希望您不是在他们(或您)在生产中做此类事情的组织中工作。您(和您的团队)在所有情况下都能正确使用此数据模型的可能性为零。甚至不会尝试触摸它。

标签: sql oracle oracle11g


【解决方案1】:

创建变量为:

v_query VARCHAR2(4000);
v_where varchar2(2000);

进行查询:

v_query := 'SELECT ... FROM ... WHERE ' || v_where

v_where 必须包含字符,并且您必须制定一个逻辑,根据您的要求创建不同的查询。

最后只需要你做:

EXECUTE IMMEDIATE v_query;

所有语句都必须定义在 Block 中。

https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems017.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2017-05-29
    • 1970-01-01
    相关资源
    最近更新 更多