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

 218
Author: Lance Roberts, 2009-07-14

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'; 
 366
Author: Paul Dixon, 2009-07-14 18:23:44
A resposta do Paul Dixon funcionou brilhantemente para mim. Para acrescentar a isso, aqui estão algumas coisas que observei para aqueles interessados em usar o REGEXP:

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.

Existem formas mais eficientes de reduzir fósforos específicos, mas isso requer mais Revisão das Expressões Regulares. Nota: nem todos os padrões de expressão regular parecem funcionar em declarações MySQL. Terá de testar os seus padrões e ver o que funciona.

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.
 154
Author: David Carroll, 2013-08-13 17:54:46

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
        )
 13
Author: Quassnoi, 2009-07-14 18:21:24

Regexp way with list of values

SELECT * FROM table WHERE field regexp concat_ws("|",
"111",
"222",
"333");
 11
Author: user136379, 2013-07-12 10:28:07

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.
 7
Author: gahooa, 2009-07-14 18:22:11

Flip operands

'a,b,c' like '%'||field||'%'
 3
Author: Ed Heal, 2012-12-06 17:36:41
Só uma dica:

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.

 2
Author: Raúl Moreno, 2014-11-06 18:33:20
Note para qualquer um que tente usar a funcionalidade "LIKE IN".

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$'
 2
Author: Shaakir, 2017-07-21 01:24:54

Isto estaria correcto:

SELECT * FROM table WHERE field regexp concat_ws("|",(
"111",
"222",
"333"
));
 1
Author: Edmhs, 2013-12-27 16:14:56

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

 0
Author: Z.I.J, 2015-12-04 12:26:22