0

次のように、すべての行のテーブルから値を選択する必要があります。

select distinct SCHM_CODE, 
       sum(DEP_AMT) as AMOUNT 
  from DLY_DEP_VIEW  
 where Schm_code in (select SCHM_CODE 
                       from DLY_DEP_VIEW )
 group by schm_code

ユーザー入力から入力を取得します。括弧内にselectステートメントは必要ありません。次のように、すべての値を返す必要があります。

select distinct SCHM_CODE, 
       sum(DEP_AMT) as AMOUNT 
  from DLY_DEP_VIEW  
 where Schm_code in (ALL_SCHM_CODES)
 group by schm_code

そしてこれは私に無効な識別子を与えています:(編集)

select distinct SCHM_CODE, 
       sum(DEP_AMT) as AMOUNT 
  from DLY_DEP_VIEW  
 where Schm_code in (select regexp_substr('" + c + "', '[^,]+',1,level) p
          from dual t
       connect by level <= regexp_count('" + c + "', ',') + 1
)
 group by schm_code;

括弧内の値は私のアプリケーションでは変化し続けるので。これを達成するための最良の方法は何ですか?クエリはJavaコード内にあります。

4

2 に答える 2

1

あなたはこのようなことを試すことができます:

select distinct SCHM_CODE, 
       sum(DEP_AMT) as AMOUNT 
  from DLY_DEP_VIEW  
 where Schm_code in (select regexp_substr(:your_string, '[^,]+',1,level) p
          from dual t
       connect by level <= regexp_count(:your_string, ',') + 1
)
 group by schm_code

:your_stringユーザーからの入力として取得した文字列で、1つまたは複数の値(コンマ区切り)を含めることができます

これがsqlfiddleのデモです

ところで、入力文字列を連結するだけでなく、バ​​インド変数を使用してプリペアドステートメントを使用します。
詳細はこちら

于 2012-11-28T15:25:45.220 に答える
0

方法の1つとして、ネストされたテーブルを使用できます。

  • ネストされたテーブルタイプを作成します。Schm_codeは数値データ型であると仮定しました。

    SQL> create or replace type t_list as table of number
      2  /
    
    Type created
    
  • クエリを次のように書き直します。リストが文字列のリストである場合、リストの各要素は一重引用符で囲む必要があります。

    select distinct SCHM_CODE, 
           sum(DEP_AMT) as AMOUNT 
      from DLY_DEP_VIEW  
      where Schm_code in (Select column_value
                            from table(t_list(<<your list of codes>>)))
      group by schm_code
    

この例では、デモンストレーションのために、Sql * plusを使用してクエリを実行し、要素を手動で入力しています。

SQL> select first_name
  2       , last_name
  3    from employees t
  4   where t.employee_id in (select column_value
  5                             from table(t_list(&list))
  6                           );
Enter value for list: 100,200
old   5:                            from table(t_list(&list))
new   5:                            from table(t_list(100,200))

FIRST_NAME           LAST_NAME                                                  
-------------------- -------------------------                                  
111                  King                                                       
Jennifer             Whalen                                                     

SQL> select first_name
  2       , last_name
  3    from employees t
  4   where t.employee_id in (select column_value
  5                             from table(t_list(&list))
  6                           );
Enter value for list: 110,300,220
old   5:                            from table(t_list(&list))
new   5:                            from table(t_list(110,300,220))

FIRST_NAME           LAST_NAME                                                  
-------------------- -------------------------                                  
John                 Chen  
于 2012-11-28T14:47:40.570 に答える