2016-09-02 6 views
0

IN条件を使用するSELECT文があり、IN条件の中に文字列があります...シングルクォートを無視するにはどうすればよいですか?私はあなたがリストを処理することを推測していOracleはIN条件内で文字列を使用します

Select * from employ where id = 12 and org_id in ({$id}) 
$id = '12,13' 

おかげ

答えて

1

inあなたの入力文字列が最初に(カンマ区切り文字に基づいて、列に分割することによって)collectionに変換する必要がありますので、collectionsで使用されて

を経由して、この

Select * from employ where id = 12 and org_id in (
SELECT decode(:input_id,null, (select employ.org_id from dual) 
,TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level))) 
    FROM (SELECT :input_id temp FROM DUAL) 
    CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+') 
    ) 

のようなものを試してみてください、このorg_id in()は、:input_idnullの場合、trueを返します。

別のアプローチは、最初の文字列として全体のクエリを作成し、次いでexecute immediateまたはphpいずれかを介してそれを実行することであろう。しかし、これはsql injectionの懸念を引き上げる可能性があります。

0

。残念ながら、SQLではパラメータをリストにすることはできませんので、より多くの作業を行う必要があります。

一つの方法は、like(または正規表現)を使用しています。

Select * 
from employ 
where id = 12 and 
     ',' || org_id || ',' like '%,' || {$id} || ',%'; 

パフォーマンスが問題であり、あなたがインデックスを使用する場合は、他のオプションを検討する必要があるかもしれません。最も簡単なのは、パラメータを省略してクエリ文字列を変更するだけです(動的SQLを使用してクエリを実行する)。

+1

問題は、IN関数内で'12,13 'を使用すると、IN関数が12と1​​3を単一の数値として読み込むためです..... – Nodos

+1

「無効な数値」は、入力は有効な番号ではありません。 INは条件であり、関数ではありません。コンパイラ(INではなく)は、'12,13 'を正確にはそれを数字ではなくSTRINGと読みます。 「無効な番号」エラーが発生します。 – mathguy

関連する問題