MySQL LIKE IN()?
a minha pergunta actual parece-se com isto:
SELECT * FROM fiberbox f WHERE f.fiberBox LIKE '%1740 %' OR f.fiberBox LIKE '%1938 %' OR f.fiberBox LIKE '%1940 %'
eu fiz alguns olhando ao redor e não consigo encontrar nada semelhante a um tipo em () - Eu imagino que funciona assim:
SELECT * FROM fiberbox f WHERE f.fiberbox LIKE IN('%140 %', '%1938 %', '%1940 %')
Alguma ideia? Estou só a pensar no problema da forma errada, um comando obscuro que nunca vi.
MySQL 5.0.77-community-log
10 answers
A expressão regular poderia ser mais eficiente, mas você teria que fazer uma referência para ter certeza, por exemplo
SELECT * from fiberbox where field REGEXP '1740|1938|1940';
Para realizar vários filtros semelhantes com caracteres especiais:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
Utilize a alternativa REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
Os valores entre aspas REGEXP e entre o operador | (ou) são tratados como caracteres especiais. Tipicamente, a expressão regular irá necessitar de expressões especiais como (.*)1740 (.* ) trabalhar em % 1740%.
Se precisar de mais controlo sobre a colocação da sequência especial, utilize algumas destas variantes:
Para realizar como com a colocação controlada de caracteres especiais:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Utilizar:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
A colocação ^ à frente do valor indica o início da linha.
Colocar $ após o valor indica fim de linha.
Colocação (.* ) comporta-se muito como o % wildcard.
O . indica qualquer carácter, excepto quebras de linha. Comercializar . inside () with * (.* ) adiciona uma repetição padrão que indica qualquer número de personagens até ao fim da linha.
Finalmente, para realizar vários filtros semelhantes e não semelhantes:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
Utilize a alternativa REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
Ou alternativa mista:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
Aviso Eu separei o não set em um filtro separado onde. Eu experimentei com o uso de padrões negativos, padrões voltados para o futuro, e assim por diante. No entanto, estas expressões não parecem produzir os resultados desejados. No primeiro exemplo acima, eu uso ^ 9999$ para indicar a correspondência exata. Isto permite-lhe adicionar correspondências específicas com correspondências de caracteres especiais na mesma expressão. No entanto, você também pode misturar estes tipos de declarações como você pode ver no segundo exemplo listado.
Quanto ao desempenho, corri. alguns testes menores contra uma tabela existente e não encontrou diferenças entre as minhas variações. No entanto, imagino que o desempenho poderia ser um problema com bases de dados maiores, campos maiores, maiores contagens de registros, e filtros mais complexos.
Como sempre, use a lógica acima como faz sentido.
Se quiser aprender mais sobre expressões regulares, recomendo www.regular-expressions.info como um bom site de referência.Pode criar uma vista em linha ou uma tabela temporária, preenchê-la com os seus valores e emitir isto:
SELECT *
FROM fiberbox f
JOIN (
SELECT '%1740%' AS cond
UNION ALL
SELECT '%1938%' AS cond
UNION ALL
SELECT '%1940%' AS cond
) с
ON f.fiberBox LIKE cond
Isto, no entanto, pode devolver-lhe várias linhas para um fiberbox
que é algo como '1740, 1938'
, por isso esta consulta pode caber-lhe melhor:
SELECT *
FROM fiberbox f
WHERE EXISTS
(
SELECT 1
FROM (
SELECT '%1740%' AS cond
UNION ALL
SELECT '%1938%' AS cond
UNION ALL
SELECT '%1940%' AS cond
) с
WHERE f.fiberbox LIKE cond
)
Regexp way with list of values
SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");
Desculpe, não há nenhuma operação semelhante a LIKE IN
em mysql.
Se quiser usar o operador similar sem uma junção, terá de o fazer desta forma:
(field LIKE value OR field LIKE value OR field LIKE value)
Sabes, o MySQL não vai otimizar essa consulta, para tua informação.
Flip operands
'a,b,c' like '%'||field||'%'
Prefiro usar a variante RLIKE (exactamente o mesmo comando que REGEXP ) porque soa mais como a linguagem natural, e é mais Curta; bem, apenas 1 caracteres.
O prefixo "R" é para a Reg. Expo., claro.
In permite-lhe fazer:
field IN (
'val1',
'val2',
'val3'
)
Na REGEXP isto não vai funcionar
REGEXP '
val1$|
val2$|
val3$
'
Tem de estar numa linha como esta.
REGEXP 'val1$|val2$|val3$'
Isto estaria correcto:
SELECT * FROM table WHERE field regexp concat_ws("|",(
"111",
"222",
"333"
));
Pode obter o resultado desejado com a ajuda de Expressões Regulares .
SELECT fiberbox from fiberbox where fiberbox REGEXP '[1740|1938|1940]';
Podemos testar a consulta acima por favor clique em SQL fiddle
SELECT fiberbox from fiberbox where fiberbox REGEXP '[174019381940]';
Podemos testar a consulta acima por favor clique em SQL fiddle