簡體   English   中英

基於表的動態where子句

[英]Dynamic where clause based on table

我想根據表形成一個動態的 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;

創建變量為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM