2016-08-09 11 views
0

私は次のクエリを持っている:ORA-00905:CASEのTHEN句のキーワードがありませんか?

SELECT name,tid FROM table_name WHERE status=1 AND 
CASE 
WHEN EXISTS (SELECT 1 FROM table_name WHERE name='name1' AND tid='tid1' AND status=1) 
THEN name='name1' AND tid='tid1' 
ELSE name='name2' AND tid='tid2' 
END; 

上記のクエリは、postgresのとMySQLのために動作しますが、Oracleには、私はこのエラーを取得:

THEN name='name1' AND AND tid='tid1' 
     * 
ERROR at line 4: 
ORA-00905: missing keyword 

誰かが私に教えてくださいすることができいただきました!ここで間違って、どのように修正するにはすべての3つののために働くのクエリ - のPostgres、MySQLとOracle

+0

それは更新ではなく選択クエリです。そのようなフィールドに値を割り当てることはできません。 –

+0

値を割り当てていないので、 'name =" name1 "AND tid =" tid1 "'はWHERE句の一部です。そして、クエリはmysqlとpostgresで動作しています。問題は私が直面しているのはoracleです。 – user2713255

+0

はい、あります。あなたの 'name =" name1 "'は "決定"文脈にはなく、 "then"の中にあります。ここでcase文の結果の値を返すべきです。 –

答えて

1

オラクルでは、CASE文は、ブール式を返すことができません。

SELECT name, tid 
FROM table_name 
WHERE status = 1 AND 
     (EXISTS (SELECT 1 FROM table_name WHERE name = 'name1' AND tid = 'tid1' AND status = 1) AND 
     name = 'name1' AND tid = 'tid1' 
    ) OR 
     (NOT EXISTS (SELECT 1 FROM table_name WHERE name = 'name1' AND tid = 'tid1' AND status = 1) AND 
     name = 'name2' AND tid = 'tid2' 
    ); 

それとも、あなたはこのように表現できる:ここでCASEせずに、あなたがやりたいための1つの方法であるブール値を持つCASEは注意が必要です理解

SELECT name, tid 
FROM table_name 
WHERE status = 1 AND 
     (CASE WHEN EXISTS (SELECT 1 FROM table_name WHERE name = 'name1' AND tid = 'tid1' AND status = 1) 
      THEN (CASE WHEN name = 'name1' AND tid = 'tid1' THEN 'true' END) 
      ELSE (CASE WHEN name = 'name2' AND tid = 'tid2' THEN 'true' END) 
    ) = 'true' 

。これはネストされたCASEステートメントでさらに真実です。ただし、このバージョンではサブクエリを1回だけ実行する利点があります。

0

Oracleでは、CASE式を使用してWHERE句に句を追加することはできません。あなたが正しくしようとしていることを理解していれば、クエリを簡略化できるように見えます。

SELECT name, tid 
    FROM table_name 
    WHERE STATUS = 1 AND 
     ((NAME = 'name1' AND 
      TID = 'tid1') OR 
     (NAME = 'name2' AND 
      TID = 'tid2')) 

最高の運があります。

+0

存在条件はどうなっているのですか?そうでない場合は 'name = '' name1 'とtid =" tdi1 "'を使用します。そうでなければ 'name =' name2 'を使用したいとします。 tid = tid2'y – user2713255

+0

さて、あなたはTABLE_NAMEからデータを取得していますが、EXISTSチェックはTABLE_NAMEに対して行われます。少なくとも、冗長であるようです。データが存在しない場合はフェッチされません。したがって、私はEXISTSチェックが全く必要ではないと思います。SELECTのTABLE_NAMEがEXISTS内のTABLE_NAMEと異なるものでない限り、 –

+0

私の要件は、 'name = 'のレコードが存在しない場合、 'name =' name2 'AND tid =' tid2''でレコードをフェッチする必要があります(これはすべて同じテーブル内にあります) – user2713255

関連する問題