Eu tenho um campo COLORS (varchar(50))
em uma minha tabela SHIRTS
que contém uma string delimitada por vírgulas, como 1,2,5,12,15,
. Cada número representa as cores disponíveis.
Ao executar a consulta select * from shirts where colors like '%1%'
para obter todas as camisas vermelhas (cor = 1), também obtenho as camisas cuja cor é cinza (= 12) e laranja (= 15).
Como devo reescrever a consulta para que selecione APENAS a cor 1 e não todas as cores que contenham o número 1?
Respostas:
A maneira clássica seria adicionar vírgulas à esquerda e à direita:
Mas find_in_set também funciona:
fonte
FIND_IN_SET é seu amigo neste caso
fonte
Dê uma olhada na função FIND_IN_SET para MySQL.
fonte
Isso vai funcionar com certeza, e eu realmente tentei:
De uma chance !!!
fonte
Se o conjunto de cores for mais ou menos fixo, a maneira mais eficiente e também mais legível seria usar constantes de string em seu aplicativo e, em seguida, usar o
SET
tipo do MySQLFIND_IN_SET('red',colors)
em suas consultas. Ao usar oSET
tipo com FIND_IN_SET , o MySQL usa um inteiro para armazenar todos os valores e usa a"and"
operação binária para verificar a presença de valores, o que é muito mais eficiente do que escanear uma string separada por vírgulas.Em
SET('red','blue','green')
,'red'
seria armazenado internamente como1
,'blue'
seria armazenado internamente como2
e'green'
seria armazenado internamente como4
. O valor'red,blue'
seria armazenado como3
(1|2
) e'red,green'
como5
(1|4
).fonte
Se você estiver usando MySQL, existe um método REGEXP que você pode usar ...
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp
Então você usaria:
fonte
Na verdade, você deve corrigir o esquema do seu banco de dados para que tenha três tabelas:
Então, se você quiser encontrar todas as camisas que são vermelhas, faça uma consulta como:
fonte
Funciona para mim
fonte
1. Para MySQL:
2. Para Postgres SQL:
Exemplo
fonte
Você pode conseguir isso seguindo a função.
Execute a consulta a seguir para criar a função.
E chame esta função assim
fonte
Todas as respostas não estão realmente corretas, tente isto:
fonte