Estoy usando una condición IF para verificar si 2 valores son iguales o no. En un escenario, todos los valores que uso son NULL, pero no reconoce que son iguales.

IF training_event_rec_.training_fee = course_rec_.course_fee AND training_event_rec_.training_fee_unit = course_rec_.course_fee_unit AND training_event_rec_.currency = course_rec_.currency AND training_evaluation_temp_ = course_evaluation_temp_ THEN
    RETURN FALSE;
ELSE
     RETURN TRUE;
END IF;

Aquí todas las variables que se comparan son NULL pero siempre llegan a la parte ELSE. ¿Cómo puedo comparar valores en este tipo de situaciones?

0
jayz 2 ene. 2020 a las 09:02

2 respuestas

La mejor respuesta

El uso es nulo:

IF     (training_event_rec_.training_fee = course_rec_.course_fee OR
       (training_event_rec_.training_fee IS NULL AND course_rec_.course_fee IS NULL))
   AND (training_event_rec_.training_fee_unit = course_rec_.course_fee_unit OR
        (training_event_rec_.training_fee_unit IS NULL AND course_rec_.course_fee_unit IS NULL))
   AND (training_event_rec_.currency = course_rec_.currency OR
        (training_event_rec_.currency IS NULL AND course_rec_.currency IS NULL))
   AND (training_evaluation_temp_ = course_evaluation_temp_ OR
        (training_evaluation_temp_ IS NULL AND course_evaluation_temp_ IS NULL))
THEN
    RETURN FALSE;
ELSE
     RETURN TRUE;
END IF;

Nota:

  • También puede comparar Nulos como NVL (COLUMN_A, 'X') = NVL (COLUMN_B, 'X') solo si está seguro de que COLUMN_A & COLUMN_B no contendrá el valor 'X'. Entonces ese no es el enfoque recomendado.
3
Ram Kumar 2 ene. 2020 a las 06:44

Supongo que podría haber diferentes combinaciones de valores no nulos y nulos. Una opción es verificarlos todos o, quizás más simple, usar NVL, como:

IF     nvl(training_event_rec_.training_fee, 0)      = nvl(course_rec_.course_fee, 0)
   AND nvl(training_event_rec_.training_fee_unit, 0) = nvl(course_rec_.course_fee_unit, 0)
   AND nvl(training_event_rec_.currency, 0)          = nvl(course_rec_.currency, 0)
   AND nvl(training_evaluation_temp_, 0)             = nvl(course_evaluation_temp_, 0)
THEN
   RETURN FALSE;
ELSE
   RETURN TRUE;
END IF;

Dependiendo de los tipos de datos, es posible que deba usar otra cosa, no 0. Por ejemplo, la moneda puede ser USD o EUR o algo así, por lo que usaría

nvl(training_event_rec_.currency, 'x')
3
Littlefoot 2 ene. 2020 a las 06:29