2012-02-21 9 views
1

私はこの(低級(p.station)LIKE '%' || c.match_text || '%')のようにしてエラーを取得するコードOracleのCASE/THEN内でLIKEを使用しますか?

WHERE p.id = m.id AND (
     CASE 
     WHEN (c.match_text IS NOT NULL) 
     THEN (
      (lower(p.station) LIKE '%'||c.match_text||'%') 
      OR 
      (
      (lower(p.station) LIKE '%sealed in%') 
      AND 
      (lower(p.affected_units) LIKE '%'||c.match_text||'%') 
     ) 
     ) 
     WHEN(u.name LIKE '%Memory%') 
     THEN (
      (lower(p.affected_fuels) LIKE '%nuclear%') 
      AND 

のこの部分を持っています!

なぜですか?

私はこのアプローチを考えていたことは問題を修正します:

WHEN (c.match_text IS NOT NULL) 
THEN (
    CASE WHEN 
    (lower(p.station) LIKE '%'||c.match_text||'%') 
    OR 
    (
     (lower(p.station) LIKE '%sealed in%') 
     AND 
     (lower(p.affected_units) LIKE '%'||c.match_text||'%') 
    ) 
    THEN true 
    ELSE false 
    END 
) 

おかげ

+2

しかし、どのようなエラーがありますか? –

+0

ORA-00907 –

+1

条件ではなくTHENの後に値が必要です。 – Andomar

答えて

6

CASE()基本的には翻訳者である:それは所与の条件のセットの値を返します。問題は、ブール値を返すように強制しようとしていることです。 BOOLEANは有効なSQLデータ型ではないため、これは機能しません。

あなたは論理をネストされたAND/OR句として実装する必要があると思います。ちょっと辛いですが、オリジナルの文よりはるかに複雑ではありません。このようなもの:

WHERE p.id = m.id 
AND ( 
     (c.match_text IS NOT NULL 
     AND (lower(p.station) LIKE '%'||c.match_text||'%' 
       OR (lower(p.station) LIKE '%sealed in%' 
        AND lower(p.affected_units) LIKE '%'||c.match_text||'%' 
       )   
      ) 
     )   
    OR (u.name LIKE '%Memory%' 
     AND lower(p.affected_fuels) LIKE '%nuclear%' 
     AND ... 
+1

+1、特に "gnarly" – Ollie

関連する問題