El equivalente de la función de decodificación de Oracle en MySQL

Mehvish Ashiq 20 junio 2023
El equivalente de la función de decodificación de Oracle en MySQL

Este tutorial presenta las tres implementaciones alternativas que podemos usar como el equivalente de la función decode() de Oracle en MySQL. Para ello utilizaremos IF(), CASE, y la combinación de FIELD() y ELT().

el equivalente de la función de decodificación de Oracle en MySQL

MySQL tiene su función decode(), pero vamos a conocer la implementación que se usaría como alternativa a la función decode() de Oracle.

Antes de entrar en las implementaciones, es mejor conocer la diferencia entre la función decode() de MySQL y la función decode() de Oracle.

MySQL decodificar() frente a Oracle decodificar()

La función decode() de MySQL decodifica la cadena codificada y genera una cadena original. Mientras que la función Oracle decode() compara una expresión con cada elemento de búsqueda uno por uno.

La base de datos de Oracle genera un resultado correspondiente si la expresión es igual al valor de búsqueda. En Oracle decode(), se devuelve el valor predeterminado si no se encuentra ninguna coincidencia y devuelve NULL si no hay un valor predeterminado.

Para practicarlo con un ejemplo de código, primero debemos tener una tabla. Creamos una tabla llamada usuarios que tiene ID, NOMBRE DE USUARIO y NIVELES como atributos.

También insertamos algunos datos para aprender con claridad. En este tutorial, puede crear y completar una tabla utilizando las consultas que se indican a continuación para seguir adelante con nosotros.

Código de ejemplo (crear y completar tabla):

# Create a table
CREATE TABLE users(
  ID INT NOT NULL AUTO_INCREMENT,
  USERNAME VARCHAR(45) NOT NULL,
  LEVELS INT NOT NULL,
  PRIMARY KEY (ID));

# Insert data
INSERT INTO users (USERNAME, LEVELS) VALUES
('mehvishashiq', 1),
('thomas011', 2),
('danielchristopher', 3),
('sairajames', 4);

SELECT * FROM users;

Producción :

| ID   | USERNAME          | LEVELS |
| ---- | ----------------- | ------ |
| 1    | mehvishashiq      | 1      |
| 2    | thomas011         | 2      |
| 3    | danielchristopher | 3      |
| 4    | sairajames        | 4      |

Utilice CASE para simular la función decode() de Oracle en MySQL

Código de ejemplo:

SELECT USERNAME,
CASE
  WHEN LEVELS = 1 THEN 'Level One'
  WHEN LEVELS = 2 THEN 'Level Two'
  WHEN LEVELS = 3 THEN 'Level Three'
  WHEN LEVELS = 4 THEN 'Level Four'
ELSE 'Beginner Level'
END AS USER_LEVEL
FROM users;

Producción :

| USERNAME          | USER_LEVEL  |
| ----------------- | ----------- |
| mehvishashiq      | Level One   |
| thomas011         | Level Two   |
| danielchristopher | Level Three |
| sairajames        | Level Four  |

La instrucción CASE también emula la función decode() de Oracle, compara cada expresión con cada valor de búsqueda y devuelve el resultado correspondiente. Aquí, se devuelve el valor predeterminado Nivel de principiante donde no se encuentra ninguna coincidencia.

Utilice IF() para simular la función decode() de Oracle en MySQL

Si queremos que los resultados se dividan en valores binarios, podemos usar IF().

Código de ejemplo:

SELECT USERNAME, IF(LEVELS >= 3,'Top Rates Plus','Top Rated') AS USER_LEVEL from users;

Producción :

| USERNAME          | USER_LEVEL     |
| ----------------- | -------------- |
| mehvishashiq      | Top Rated      |
| thomas011         | Top Rated      |
| danielchristopher | Top Rated Plus |
| sairajames        | Top Rated Plus |

Utilice la combinación de FIELD y ELT para simular la función decode() de Oracle en MySQL

Código de ejemplo:

SELECT USERNAME,
IFNULL(ELT( FIELD(LEVELS,1,2,3,4),
           'Level One', 'Level Two',
           'Level Three', 'Level Four'
        ),'Beginner Level')
As USER_LEVEL FROM users;

Producción :

| USERNAME          | USER_LEVEL  |
| ----------------- | ----------- |
| mehvishashiq      | Level One   |
| thomas011         | Level Two   |
| danielchristopher | Level Three |
| sairajames        | Level Four  |

Aquí, FIELD() genera la posición de la lista de argumentos de la cadena que coincide con LEVELS. Ahora, ELT() genera una cadena de la lista de argumentos de ELT() en una posición especificada por FIELD().

Por ejemplo, si NIVELES es 2, FIELD(NIVELES,1,2,3,4) devuelve 2. Porque 2 es el segundo argumento de FIELD (no cuente LEVEL aquí).

Entonces, el ELT(2, 'Level One', 'Level Two', 'Level Three', 'Level Four') devuelve Level Two, que es un segundo argumento de ELT() (no cuente el FIELD() como un argumento aquí).

Además, IFNULL devuelve un NIVEL_USUARIO predeterminado si no coincide ningún valor de NIVEL en la lista. De esta forma, podemos usar la combinación de ELT y FIELD para simular la función decode() de Oracle en MySQL.

Recuerde, esta solución puede no ser una buena opción teniendo en cuenta el rendimiento y la legibilidad, pero es buena para explorar las funciones de cadena de MySQL.

Otro punto que vale la pena señalar es que la salida FIELD() no distingue entre mayúsculas y minúsculas. Significa que FIELD('B','B') y FIELD('b','B') devuelven el mismo resultado, que es 1.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook