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.
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:
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.