web-dev-qa-db-ja.com

Where句内のIfステートメント

「WHERE」句内に「IF」ステートメントを含むクエリを使用しています。しかし、PL\SQL Developerは実行中にエラーを発生させます。誰かが正しいクエリで私を助けてくれますか?クエリは次のとおりです。

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:右括弧がありません」が発生します

12
user2100620

ケースはあなたを助けるかもしれません:

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ステートメント は、複数の条件を評価して単一の値を生成します。そのため、最初の使用では、status_flagの値をチェックし、値に応じて「A」、「T」、またはnullを返し、それをt.statusと比較します。 2番目のCASEステートメントを使用して、business_unit列にも同じことを行います。

11
DCookie

そのようなIFは使用できません。 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;
4
John Kugelman