A continuación se muestra la tabla de animales en varios pisos.

ID, FLOOR_LEVEL, ANIMAL [nombres de columna]

01, A, CAT
02, A, PERRO
03, B, PERRO
04, B, CAT
05, B, CAT
06, C, CAT

Quiero etiquetar los tipos de animales (es decir, el gato se etiquetará como 1, el perro se etiquetará como 2 ...) como se muestra a continuación creando una nueva etiqueta LABEL.

ID, FLOOR_LEVEL, ANIMAL, LABEL [nombres de columna]

01, A, CAT, 1
02, A, PERRO, 2
03, B, PERRO, 2
04, B, CAT, 1
05, B, CAT, 1

06, C, CAT, 1

Puede hacerse escribiendo consultas como INSERT INTO table_name (LABEL) VALUES (1,2,2,1,1,1);

Pero, ¿cómo se puede generalizar para un gran no. de diferentes tipos de animales en MySQL escribiendo consulta? Por favor ayuda.

-1
MKK 2 mar. 2018 a las 01:29

4 respuestas

La mejor respuesta

Si su requisito es no una etiqueta numérica, intente usar md5() para generar una etiqueta hash para los animales. Su valor sería el mismo para animales con el mismo nombre (distingue entre mayúsculas y minúsculas).

SELECT ID, FLOOR_LEVEL, ANIMAL, MD5(UPPER(ANIMAL))
FROM table;

Tenga en cuenta que la cadena MD5() distingue entre mayúsculas y minúsculas. es decir, DOG y Dog generarían una salida diferente, por lo tanto, he utilizado el método UPPER().

Otra opción es usar la siguiente función, que convertirá el valor alfanumérico md5() en un tipo largo. Pero el valor numérico no comenzaría desde 1, 2, etc.

cast(conv(substring(md5(upper(animal)), 1, 16), 16, 10) as unsigned integer)

EDITAR - Basado en comentarios OP

Pero, ¿hay alguna forma de reducir la longitud de los valores generados?

Para reducir la longitud del valor generado, use la función rand() sabiamente para reducir la longitud del entero. La única preocupación es que es posible que no desee una colisión de valores generados.

round(cast(conv(substring(md5(upper(animal)), 1, 16), 16, 10) as unsigned integer) * (rand() * rand()))

Se puede generar un valor más sofisticado, optimizado y sin colisión utilizando Hive UDF.

0
Gyanendra Dwivedi 9 mar. 2018 a las 21:30

Su declaración INSERT no tiene sentido:

 INSERT INTO table_name (LABEL) VALUES (1,2,2,1,1,1);

Insertará 1 fila en una tabla llamada nombre_tabla con 6 columnas. No haría nada por ti.

En su lugar, cree una nueva tabla para almacenar el animal id y el animal name:

CREATE TABLE animals ( id int, animal_name VARCHAR(50));
INSERT INTO animals VALUES (1, 'cat'),(2, 'dog'),(3,'tardigrade'),(4,'liger');

Y luego une eso a tu consulta:

SELECT t1.floor_level, t1.animal, t2.id
FROM table t1
    INNER JOIN animals t2 ON
        t1.animal = t2.animal_name;

Opcionalmente, puede usar una declaración de caso para hacer esto dentro de la consulta. Sin embargo, se volverá un poco laborioso si tienes un montón de animales. Y tendrá que volver a escribirlo cada vez que consulte esta tabla.

SELECT floor_level, 
  animal, 
  CASE WHEN animal = 'cat' THEN 1 
    WHEN animal = 'dog' THEN 2 
    WHEN animal = 'tardigrade' THEN 3 
    WHEN animal = 'liger' THEN 4 
    END as animal_id
FROM table;
1
JNevill 1 mar. 2018 a las 22:42

El comando que está buscando es CASO

SELECT ID, FLOOR_LEVEL, ANIMAL,
CASE
 WHEN ANIMAL = 'CAT' THEN 1
 WHEN ANIMAL = 'DOG' THEN 2
END
FROM table;
0
Ben373 2 mar. 2018 a las 17:01

La forma más sencilla de resolver su problema es con un DECODE

SELECT
 DECODE( 
 ANIMAL,
 'CAT',1,
 'DOG',2,
 'OTHER'
 )
 FROM ...

Aquí hay más información: https://docs.oracle.com/cd/B19306_01/ server.102 / b14200 / functions040.htm

¡Buena suerte!

0
Claudio Tellaeche 1 mar. 2018 a las 23:52