es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SQL – Devolviendo fila en ‘select * where id =’ donde id es una subcadena de la cadena pasada

Tengo una consulta de base de datos en la que paso una cadena para seleccionar cuando coincide un entero (id) o una cadena (nombre).

Por ejemplo:

id (int) nombre (varchar)
13 thisisa_name

Estoy pasando porque quiero poder encontrar en ambos casos.

El problema es que, cuando ejecuto la siguiente consulta, que debería no devolver nada:

SELECT * FROM items 
WHERE 
nombre = '13ff66201c8814f568bd1e5ba304486a' 
OR 
id = '13ff66201c8814f568bd1e5ba304486a' 
ORDER BY id ASC LIMIT 1;

Obtengo una coincidencia en el id cuando no debería estar devolviendo filas. ¿Alguien puede explicar por qué está sucediendo esto? Entiendo que es algún tipo de problema de conversión de cadena a entero dado que los primeros dos caracteres de la cadena son 13, pero parece ser un comportamiento incorrecto.

Estoy haciendo esto de esta manera porque necesito identificar en un punto clave si estoy tratando con un tipo de datos en particular cuando el tipo de datos no haya sido vinculado anteriormente a través de una tabla de enlace.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que la consulta está interpretando la cadena ’13ff66201c8814f568bd1e5ba304486a’ como un entero debido a que los primeros dos caracteres son ’13’, que es el mismo valor que el id en la tabla. Esto es probablemente debido a la conversión implícita de tipos en el motor de consulta.

    Para evitar esto, puedes convertir explícitamente la cadena de entrada a un tipo de datos no numérico usando una función como CAST o CONVERT. Por ejemplo:

    SELECT * FROM items 
    WHERE 
    (name = '13ff66201c8814f568bd1e5ba304486a' AND id != 13)
    OR 
    id = CAST('13ff66201c8814f568bd1e5ba304486a' AS UNSIGNED)
    ORDER BY id ASC LIMIT 1; 
    

    En esta consulta modificada, primero verificamos si la cadena de entrada coincide con la columna de nombre y el id no es igual a 13. Luego verificamos si la cadena de entrada se puede convertir a un entero no firmado para que coincida con la columna de id.

    Ten en cuenta que esta solución asume que la cadena de entrada nunca será un valor entero válido de la columna de id. Si existe la posibilidad de superposición, es posible que necesites un enfoque diferente.

Comments are closed.