0

重複の可能性:
Oracle SQLのWHERE IN句で変数を渡す方法は?

Prefixテーブルに、次のTbl_Prefixようにコンマで区切られた文字列として値を持つ列があります。

'aaa','bbb','ccc'

Tbl_Employee次のような従業員テーブルがあります。

Empno Prefix
------------
1000  aaa
2000  eee
3000  ccc
4000  aaa
5000  ddd

このクエリの句のIN部分で、このプレフィックスを使用する必要があります。WHERE

Select * 
from Tbl_Employee  
where Tbl_Employee.Prefix  in (select  Tbl_Prefix.prefix 
                               from Tbl_Prefix 
                               where Tbl_Prefix.flag = 'y') 

内側の選択クエリselect Tbl_Prefix.prefix from Tbl_Prefix where Tbl_Prefix.flag='y'には結果があります'aaa','bbb','ccc'

適切な結果が得られるように、この文字列を 'IN' 句で使用するにはどうすればよいですか?

4

2 に答える 2

1

まず、それをしないでください。データ バケット/リンク テーブルを作成し、aaa、bbb、および ccc を関連する関係にリンクします。

ただし、このようにする必要がある場合 (可能であれば変更してください)、動的 SQL 文字列を作成して実行する必要があります。そのため、select から where を介して文字列を作成し、"Prefix" で区切られた文字列を追加してから、 を呼び出しますEXEC

したがって、次のように設定します。

@sql = 'SELECT YOURSTUFF FROM YOURTABLE WHERE YOURCOLUMN IN ' + @prefix. @prefix必要な tbl_Prefix の列値 (aaa、bbb、ccc) である必要があります。

文字列が構築されると、EXEC @sql

于 2012-11-04T08:27:14.840 に答える
0

これらの値がそのようにデータベースに保存されている場合は、データベースの設計を真剣に再検討する必要があります。各親レコードのコンマ区切り値ごとにレコードを含む子テーブルを作成します。

EXISTS今のところ、とを使用して逃げることができLIKEますが、レコードがたくさんある場合、このクエリはすぐに遅くなります。

select 
  * 
from 
  Tbl_Employee e
where 
  exists  
    (select * from 
       Tbl_Prefix x
    where
       x.flag = 'y' and
       x.prefix like '%''' + e.prefix + '''%') 
       -- Add quotes to prevent false matches
于 2012-11-04T08:30:30.707 に答える