2017-04-19 12 views
1

として論理演算子によるステートメントの実行:ここ私はOracleでSQL文を実行しようとしている変数

FLAG := CASE WHEN @LOOP_COUNT @TARGET_OPERATOR_1 1 THEN 'GREEN' 
     ELSE 'RED' 
     END; 

を@Loop_count =いくつかの数 とTarget_operator_1 @は比較です演算子「>」または '<です'または'> = '

CASE式内のすべての組み合わせをハードコードすることができますが、動的SQLで可能かどうかを確認したかっただけです。

乾杯、

+0

ご質問にはSQL文はありません。おそらくPL/SQLコードですが、SQL文はありません。 – Seyran

+2

これは有効なOracle SQLまたはPL/SQLではありません。 PL/SQLの場合、次のいずれかを予期すると、 'PLS-00103:シンボル" @が発生しました:... "@"というシンボルは無視されました。 " - あなたはSQL Serverまたはいくつかの他のRDBMS? – MT0

+0

私は変数名を区別するために@を書きました..そして、それはPLSQLスクリプトの一部です.. :) – thealchemist

答えて

2

私はよく理解していれば、あなたは次のようなものが必要になる場合があります

declare 
    /* declare a variable to host a SQL query */ 
    vSQL varchar2(1000); 
    vResult varchar2(1000); 
begin  
    /* build the SQL query as a string and save it into the variable */ 
    select 'select case ' || chr(13) || chr(10) || 
      listagg ('when ' || n1.num || op || n2.num || ' then ''' || n1.num || op || n2.num || '''', chr(13) || chr(10)) 
      within group (order by 1) 
      || ' end' || chr(13) || chr(10) || 
      'from dual' 
    into vSQL 
    from (select '<' as op from dual union all 
      select '>'  from dual union all 
      select '>='  from dual union all 
      select '>='  from dual 
     ) operators 
    cross join (
       select level as num 
       from dual 
       connect by level <= 2 
       ) n1 
    cross join (
       select level -1 as num 
       from dual 
       connect by level <= 1 
       ) n2; 
    -- 
    /* print the query */ 
    dbms_output.put_line(vSQL); 
    /* run the dynamic query just built and get the result */ 
    execute immediate vSQL into vResult; 
    /* print the result */ 
    dbms_output.put_line(vResult); 
end;  

実行すると、これが与える:変数と

select case 
when 1<0 then '1<0' 
when 1>0 then '1>0' 
when 1>=0 then '1>=0' 
when 1>=0 then '1>=0' 
when 2<0 then '2<0' 
when 2>0 then '2>0' 
when 2>=0 then '2>=0' 
when 2>=0 then '2>=0' end 
from dual 
1>0 

を、この:

declare 
    vNumVar1 number; 
    vNumVar2 number; 
    vOpVar  varchar2(2); 
    vSQL  varchar2(100); 
    vResult  varchar2(100); 
begin 
    vNumVar1 := 1; 
    vNumVar2 := 3; 
    vOpVar := '<='; 
    vSQL := 'select case when ' || vNumVar1 || vOpVar || vNumVar2 || ' then ''something'' end from dual'; 
    dbms_output.put_line(vSQL); 
    execute immediate vSQL 
    into vResult; 
    dbms_output.put_line(vResult); 
end; 

gi ves:

select case when 1<=3 then 'something' end from dual 
something 
+0

私はあなたが私の質問を誤解していると思う..私はnum1、 num2 ..私はこのようなSQLステートメントをCASE関数で実行したいと思う..それで大文字になるだろうnum1 logical_operator num2次に 'green'(2> 1と 'green'と読む) – thealchemist

+0

それほど違いはない。 – Aleksej

+0

あなたは信じられない:)あなたに私の心からのおかげであなたを示すために編集.. – thealchemist

関連する問題