Case

Otra funcionalidad que tenemos en el Open SQL es la expresión CASE que compara valores. Por su sintaxis se puede estructurar en dos tipos: el simple y el complejo.

  1. CASE simple
  • Sintaxis

CASE operand
WHEN operand1 THEN result1
[WHEN operand2 THEN result2]

[ELSE result_n]
 
END
 

  • Efecto

La expresión SQL compara los valores del operando “operand” con los operandos (uno después del otro) operand1, operand2, operandX y devuelve el resultado asignado después de THEN (para lo cual la comparación es verdadera la primera vez). Si no se encuentran coincidencias, se selecciona el resultado especificado después de ELSE. Si no se especifica ELSE, el resultado es el valor cero.
Los operandos de operand1, operand2, operandX. y los resultados result1, result2, resultX. pueden ser expresiones SQL, que cubren columnas, literales, variables de host y expresiones de host. Pueden tener cualquier tipo de diccionario, excepto ACCP, DF16_SCL (obsoleto), DF34_SCL (obsoleto), LCHR, LRAW, PREC, RAWSTRING y STRING. Los literales, las variables de host y las expresiones de host pueden tener cualquier tipo de ABAP, a excepción de STRING y XSTRING.
El tipo de datos del “operand” debe ser comparable con los tipos de datos de los operandos operand1, operand2, operandX. Si este no es el caso, un tipo estáticamente especificado genera un error de sintaxis y un tipo especificado dinámicamente genera una excepción de la clase CX_SY_DYNAMIC_OSQL_SEMANTICS. Los resultados también deben ser compatibles para producir un tipo de resultado común: los tipos de datos result1, result2, resultX deben ser del mismo tipo de dato o el tipo de datos debe poder representar completamente como valor de todos los demás tipos de datos. El resultado tiene el tipo del diccionario de datos.
Si un operando de una comparación tiene el valor nulo, el resultado de esta comparación es desconocido.

  1. CASE complejo
  • Sintaxis

CASE WHEN sql_cond1 THEN result1
[WHEN sql_cond2 THEN result2]
[WHEN sql_cond3 THEN result3]

[ELSE result_n]
 
END

  • Efecto

La expresión SQL CASE compleja evalúa las expresiones lógicas sql_cond1, sql_cond2, … en orden y proporciona el resultado después de THEN de la primera expresión lógica que es verdadera. Si ninguna de las expresiones lógicas es verdadera, se selecciona el resultado especificado después de ELSE. Si no se especifica ELSE, el resultado es el valor cero.
Las expresiones lógicas sql_cond son un subconjunto de las expresiones lógicas sql_cond de una condición WHERE, pero también permiten que se utilicen las expresiones SQL. Se puede construir una expresión lógica sql_cond usando AND y OR y se pueden negar usando NOT.

  • OPERAND1 = | <> |> | <|> = | <= OPERAND2

Compara el operando OPERAND1 en el lado izquierdo con el operando OPERAND2 en el lado derecho. Lo mismo aplica para los operadores relacionales como en una condición WHERE, pero los operandos de comparaciones de tamaño deben tener tipos de datos numéricos. El operando OPERAND1 en el lado derecho puede ser cualquier expresión SQL, que cubre columnas, literales, variables de host y expresiones de host. Si un operando de la comparación tiene el valor nulo, se desconoce el resultado de esta comparación.

  • operand BETWEEN operand1 AND operand2

Comprueba la asignación a un intervalo. La expresión relacional funciona de la misma manera que la condición WHERE. Los operandos deben, sin embargo, tener tipos de datos numéricos aquí. Se pueden especificar variables de host apropiadas y expresiones de host para operand1 y operand2. Si el operando tiene el valor nulo, el resultado de la verificación es desconocido.

  • operand IS [NOT] NULL

Verifica el valor nulo. La expresión relacional funciona de la misma manera que la condición WHERE.
Los operandos en el lado izquierdo y los resultados result1, result2, pueden ser expresiones SQL, que cubren columnas, literales, variables de host y expresiones de host. Las columnas y expresiones que se producen pueden tener cualquier tipo de diccionario, excepto ACCP, DF16_SCL (obsoleto), DF34_SCL (obsoleto), LCHR, LRAW, PREC, RAWSTRING y STRING. Los literales, las variables de host y las expresiones de host pueden tener cualquier tipo de ABAP, a excepción de STRING y XSTRING. Sin embargo, las comparaciones de tamaño y el operador BETWEEN sólo se pueden especificar para los tipos numéricos distintos de los números de punto flotante decimal.
Debe ser posible comparar los tipos de datos de los operandos de una expresión relacional. Si este no es el caso, un tipo estáticamente especificado genera un error de sintaxis y un tipo especificado dinámicamente genera una excepción de la clase CX_SY_DYNAMIC_OSQL_SEMANTICS. Los resultados también deben ser compatibles para producir un tipo de resultado común: los tipos de datos result1, result2, resultX deben ser los mismos o el tipo de datos debe poder representar completamente el valor de todos los demás tipos de datos. El resultado tiene el tipo del diccionario de datos.

  • Notas

Cuando se usa CASE complejo, la verificación de sintaxis se realiza en un modo estricto desde la Versión 7.40, SP08, que maneja la declaración más estrictamente que la comprobación de sintaxis regular.
Cuando las expresiones de SQL se especifican en el lado izquierdo o las expresiones de host ocurren en el lado derecho, la comprobación de sintaxis se realiza en un modo estricto desde la Versión 7.50, que maneja la declaración más estrictamente que la comprobación de sintaxis regular.

  1. Ejemplo práctico

En un programa ejecutable implementamos la lógica que insertará en la tabla de base de datos estándar DEMO_EXPRESSIONS números aleatorios entre los valores 1 y 40 en las columnas NUM1 y NUM2. Insertamos 10 registros asignando los identificadores de 0 a 9 en la columna ID.  En cada ejecución del programa eliminamos e insertamos de nuevo los registros para obtener valores diferentes en las columnas NUM1 y NUM2. Utilizamos la clase estándar CL_ABAP_RANDOM_INT para obtener los números aleatorios. Una vez implementada esta lógica realizamos un SELECT en la misma tabla estándar DEMO_EXPRESSIONS obteniendo en una tabla interna los registros con los identificadores insertados de 0 a 9. La estructura de la tabla interna va contener los siguientes componentes:

  • NUM1 (Columna de la tabla)
  • NUM2 (Columna de la tabla)
  • GRUPO (El valor ‘Ambos < 20’ si los valores de las columnas NUM1 y NUM2 son menores que 20, ‘Ambos > 20’ si los valores de las columnas NUM1 y NUM2 son mayores que 20, ‘Ambos = 20’ si los valores de las columnas NUM1 y NUM2 son iguales al valor 20 y ‘Otro’ cuando no se cumplen las condiciones anteriores)

Por último, mostramos los resultados del SELECT ordenando ascendente por la columna GRUPO en una ventana utilizando el método estático DISPLAY de la clase CL_DEMO_OUTPUT.

Al ejecutar el programa tenemos el siguiente resultado: 23
Nota: En cada ejecución el resultado es distinto por los valores aleatorios de las columnas NUM1 y NUM2.
 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *