2013-03-13 13 views
5

"WHERE"句内の "IF"文を含むクエリを処理しています。しかし、PL \ SQL Developerは実行中にいくつかのエラーを出しています。誰でも正しい質問で私を助けてくれますか?Where句内の文

SELECT t.first_name, 
     t.last_name, 
     t.employid, 
     t.status 
    FROM employeetable t 
WHERE IF status_flag = STATUS_ACTIVE then t.status = 'A' 
     IF status_flag = STATUS_INACTIVE then t.status = 'T' 
     IF source_flag = SOURCE_FUNCTION then t.business_unit = 'production' 
     IF source_flag = SOURCE_USER then t.business_unit = 'users' 
    AND t.first_name LIKE firstname 
    AND t.last_name LIKE lastname 
    AND t.employid LIKE employeeid; 

「ORA-00920:無効なリレーショナル演算子」というエラーが表示されます。

エラーでstatus_flag = STATUS_ACTIVE結果、「ORA-00907:欠落している右括弧」周りの括弧を置くような場合に使用することはできません

答えて

9

CASEはあなたを助けるかもしれない:

SELECT t.first_name, 
     t.last_name, 
     t.employid, 
     t.status 
    FROM employeetable t 
WHERE t.status = (CASE WHEN status_flag = STATUS_ACTIVE THEN 'A' 
         WHEN status_flag = STATUS_INACTIVE THEN 'T' 
         ELSE null END) 
    AND t.business_unit = (CASE WHEN source_flag = SOURCE_FUNCTION THEN 'production' 
           WHEN source_flag = SOURCE_USER THEN 'users' 
           ELSE null END) 
    AND t.first_name LIKE firstname 
    AND t.last_name LIKE lastname 
    AND t.employid LIKE employeeid; 

CASE statementは、単一の値を生成するために複数の条件を評価します。したがって、最初の使用法では、status_flagの値をチェックし、値が何であるかに応じて 'A'、 'T'またはnullを返し、それをt.statusと比較します。私は、2番目のCASEステートメントでbusiness_unit列に対しても同じことをします。

+0

ありがとう!本当に助けてくれました – user2100620

+0

@DCookie IF文の中にWHERE句の条件を追加するにはどうしたらいいですか? – masT

+0

ケース:t.statusが実際にnullの場合、 't.status = null'は機能しません。 Nullは変だ。 – defactodeity

3

を。あなたはANDやORでやりたいことができます。

SELECT t.first_name, 
     t.last_name, 
     t.employid, 
     t.status 
    FROM employeetable t 
WHERE (status_flag = STATUS_ACTIVE AND t.status = 'A' 
    OR status_flag = STATUS_INACTIVE AND t.status = 'T' 
    OR source_flag = SOURCE_FUNCTION AND t.business_unit = 'production' 
    OR source_flag = SOURCE_USER  AND t.business_unit = 'users') 
    AND t.first_name LIKE firstname 
    AND t.last_name LIKE lastname 
    AND t.employid LIKE employeeid; 
+0

ANDとORを使用する代わりに、CASEを使用するとどうなりますか? 'CASE status_flag = STATUS_ACTIVE次いでt.status = '' status_flagは= STATUS_INACTIVE次いでt.status = 'T' source_flag = SOURCE_FUNCTION次いでt.business_unit = '生産' source_flag = SOURCE_USER次いでt.business_unit = 'ユーザの END とlastName LIKE firstnameの とt.last_name LIKE t.first_nameと社員LIKE t.employid; ' 私はエラー "ORA-00905を:不足しているキーワード" を得ます。その場合、私は間違って何をしましたか? – user2100620

+0

私の答えを見てください。あなたは近づいています。 – DCookie