Minha consulta atual é assim:
SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'
Eu olhei em volta e não consigo encontrar nada parecido com um LIKE IN () - eu imagino que funcione assim:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')
Alguma ideia? Estou apenas pensando no problema da maneira errada - algum comando obscuro que eu nunca vi.
MySQL 5.0.77-community-log
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")
%
Respostas:
Um REGEXP pode ser mais eficiente, mas você precisa compará-lo para ter certeza, por exemplo,
fonte
REGEXP
era proibitivamente lento, mas precisava da flexibilidade do REGEXP para restringir ainda mais o meu conjunto de resultadosLIKE
. Eu vim com uma solução híbrida onde usei ambosLIKE
eREGEXP
; apesar daREGEXP
parte ser suficiente para me fornecer os resultados corretos, oLIKE
MySQL também permitiu reduzir o conjunto de resultados consideravelmente antes de ter que usar osREGEXP
critérios mais lentos .(select group_concat(myColumn separator '|') from..)
A resposta de Paul Dixon funcionou brilhantemente para mim. Para adicionar isso, aqui estão algumas coisas que observei para os interessados em usar o REGEXP:
Para realizar vários filtros LIKE com caracteres curinga:
Use a alternativa REGEXP:
Valores entre aspas REGEXP e entre os | (OR) são tratados como curingas. Normalmente, o REGEXP exigirá expressões curinga como (. *) 1740 (. *) Para funcionar como% 1740%.
Se você precisar de mais controle sobre o posicionamento do curinga, use algumas destas variantes:
Para realizar o LIKE com o posicionamento curinga controlado:
Usar:
Colocar ^ na frente do valor indica o início da linha.
Colocar $ após o valor indica o fim da linha.
A colocação (. *) Se comporta como o curinga%.
O . indica qualquer caractere único, exceto quebras de linha. Colocação. inside () com * (. *) adiciona um padrão de repetição indicando qualquer número de caracteres até o final da linha.
Existem maneiras mais eficientes de restringir correspondências específicas, mas isso requer mais revisão das Expressões Regulares. NOTA: Nem todos os padrões de expressão regular parecem funcionar nas instruções do MySQL. Você precisará testar seus padrões e ver o que funciona.
Por fim, para realizar vários filtros LIKE e NOT LIKE:
Use a alternativa REGEXP:
OU Alternativa mista:
Observe que eu separei o conjunto NOT em um filtro WHERE separado. Eu experimentei usar padrões de negação, padrões de previsão e assim por diante. No entanto, essas expressões não parecem produzir os resultados desejados. No primeiro exemplo acima, eu uso ^ 9999 $ para indicar a correspondência exata. Isso permite adicionar correspondências específicas com correspondências curinga na mesma expressão. No entanto, você também pode misturar esses tipos de instruções, como você pode ver no segundo exemplo listado.
Em relação ao desempenho, executei alguns testes menores em uma tabela existente e não encontrei diferenças entre minhas variações. No entanto, imagino que o desempenho possa ser um problema com bancos de dados maiores, campos maiores, maior número de registros e filtros mais complexos.
Como sempre, use a lógica acima, pois faz sentido.
Se você quiser aprender mais sobre expressões regulares, recomendo www.regular-expressions.info como um bom site de referência.
fonte
WHERE IFNULL(field, '') NOT REGEXP '1740 | 1938'
Você pode criar uma exibição em linha ou uma tabela temporária, preenchê-la com seus valores e emitir o seguinte:
No entanto, isso pode retornar várias linhas para uma
fiberbox
que é algo parecido'1740, 1938'
, portanto, essa consulta pode ser melhor para você:fonte
Regexp maneira com lista de valores
fonte
Desculpe, não há operação semelhante à
LIKE IN
do mysql.Se você quiser usar o operador LIKE sem uma junção, precisará fazer o seguinte:
Você sabe, o MySQL não otimizará essa consulta, FYI.
fonte
Apenas observe quem está tentando o REGEXP para usar a funcionalidade "LIKE IN".
IN permite que você faça:
No REGEXP, isso não funcionará
Tem que estar em uma linha como esta:
fonte
Operandos flip
fonte
create table x(en enum('a,b,c')));insert into x values('a'),('b')
en apenas a ou b fazer esse método lançando oprandsselect * from, x where 'a,c' like concat('%',en,'%')
pode ser mais seguro em Liminar SQL há necessidade de escapar charactors como $ ^ etc.field
só pode ser exatamentea
,b
ouc
então você deve usarfield IN ('a', 'b', 'c')
. Mas, em casos gerais, isso NUNCA pode substituir,field LIKE '%a%' OR field LIKE '%b%' OR ...
pois o próprio campo pode ser algomagic
que tornaria'magic' LIKE '%a%'
verdadeiro, mas a expressão'a,b,c' LIKE '%magic%'
falsa.Isso seria correto:
fonte
Apenas uma pequena dica:
Prefiro usar a variante RLIKE (exatamente o mesmo comando do REGEXP ), pois soa mais como linguagem natural e é mais curta; bem, apenas 1 caractere.
O prefixo "R" é para Reg. Exp., É claro.
fonte
Você pode obter o resultado desejado com a ajuda de expressões regulares .
Podemos testar a consulta acima, por favor clique SQL violino
Podemos testar a consulta acima, por favor clique SQL violino
fonte
[...]
é um conjunto de caracteres , o que significa que qualquer um dos caracteres do conjunto é suficiente para ser visto como uma correspondência. Portanto, qualquer valor com os dígitos "0
,1
,3
,4
,7
,8
,9
ou o|
caractere pipe irá corresponder a isso.