Tengo un campo COLORS (varchar(50))
en mi tabla SHIRTS
que contiene una cadena delimitada por comas como 1,2,5,12,15,
. Cada número representa los colores disponibles.
Al ejecutar la consulta select * from shirts where colors like '%1%'
para obtener todas las camisetas rojas (color = 1), también obtengo las camisetas cuyo color es gris (= 12) y naranja (= 15).
¿Cómo debo reescribir la consulta para que seleccione SOLO el color 1 y no todos los colores que contienen el número 1?
Respuestas:
La forma clásica sería agregar comas a la izquierda y a la derecha:
Pero find_in_set también funciona:
fuente
FIND_IN_SET es tu amigo en este caso
fuente
Eche un vistazo a la función FIND_IN_SET para MySQL.
fuente
Esto funcionará con seguridad, y de hecho lo probé:
Darle una oportunidad !!!
fuente
Si el conjunto de colores es más o menos fijo, la forma más eficiente y también más legible sería usar constantes de cadena en su aplicación y luego usar el
SET
tipo de MySQLFIND_IN_SET('red',colors)
en sus consultas. Cuando se usa elSET
tipo con FIND_IN_SET , MySQL usa un entero para almacenar todos los valores y usa la"and"
operación binaria para verificar la presencia de valores, lo cual es mucho más eficiente que escanear una cadena separada por comas.En
SET('red','blue','green')
,'red'
se almacenaría internamente como1
,'blue'
se almacenaría internamente como2
y'green'
se almacenaría internamente como4
. El valor'red,blue'
se almacenaría como3
(1|2
) y'red,green'
como5
(1|4
).fuente
Si está usando MySQL, hay un método REGEXP que puede usar ...
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp
Entonces usarías:
fuente
En realidad, debería arreglar el esquema de su base de datos para tener tres tablas:
Luego, si desea encontrar todas las camisetas que son rojas, haría una consulta como:
fuente
Funciona para mi
fuente
1. Para MySQL:
2.Para Postgres SQL:
Ejemplo
fuente
Puede lograr esto siguiendo la función.
Ejecute la siguiente consulta para crear la función.
Y llama a esta función así
fuente
Todas las respuestas no son realmente correctas, intente esto:
fuente