использовать как внутри CASE / THEN в Oracle? - PullRequest
1 голос
/ 21 февраля 2012

У меня есть эта часть кода

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

Я получаю сообщение об ошибке LIKE в этом (нижняя (p.station) LIKE '%' || c.match_text || '%') !!

почему это так?

Я думал, что этот подход решит проблему:

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
)

Спасибо

1 Ответ

6 голосов
/ 21 февраля 2012

CASE () в основном переводчик: он возвращает значение для заданного набора условий. Проблема в том, что вы пытаетесь заставить его вернуть значение BOOLEAN. Это не будет работать, потому что BOOLEAN не является допустимым типом данных SQL.

Так что я думаю, вам придется реализовать свою логику в виде вложенных предложений И / ИЛИ. Это немного грубовато, но не намного сложнее, чем ваше первоначальное утверждение. Примерно так:

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 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...