La risposta di Paul Dixon ha funzionato perfettamente per me. Per aggiungere a questo, ecco alcune cose che ho osservato per coloro che sono interessati all'utilizzo di REGEXP:
Per realizzare più filtri LIKE con i caratteri jolly:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
Usa l'alternativa REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
Valori tra virgolette REGEXP e tra | Gli operatori (OR) vengono trattati come caratteri jolly. In genere, REGEXP richiede espressioni jolly come (. *) 1740 (. *) Per funzionare come% 1740%.
Se è necessario un maggiore controllo sul posizionamento del carattere jolly, utilizzare alcune di queste varianti:
Per realizzare COME con posizionamento jolly controllato:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Uso:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
Posizionare ^ davanti al valore indica l'inizio della riga.
Il posizionamento di $ dopo il valore indica la fine della riga.
Il posizionamento (. *) Si comporta in modo molto simile al carattere jolly%.
Il . indica un singolo carattere, tranne le interruzioni di riga. Posizionamento inside () con * (. *) aggiunge uno schema ripetuto che indica un numero qualsiasi di caratteri fino alla fine della riga.
Esistono modi più efficienti per restringere le corrispondenze specifiche, ma ciò richiede una maggiore revisione delle espressioni regolari. NOTA: non tutti i pattern regex sembrano funzionare nelle istruzioni MySQL. Dovrai testare i tuoi schemi e vedere cosa funziona.
Infine, per realizzare più filtri LIKE e NOT LIKE:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
Usa l'alternativa REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
O alternativa mista:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
Si noti che ho separato il set NOT in un filtro WHERE separato. Ho sperimentato l'uso di schemi negativi, schemi lungimiranti e così via. Tuttavia, queste espressioni non sembravano produrre i risultati desiderati. Nel primo esempio sopra, uso ^ 9999 $ per indicare la corrispondenza esatta. Ciò consente di aggiungere corrispondenze specifiche con corrispondenze con caratteri jolly nella stessa espressione. Tuttavia, puoi anche mescolare questi tipi di istruzioni come puoi vedere nel secondo esempio elencato.
Per quanto riguarda le prestazioni, ho eseguito alcuni test minori su una tabella esistente e non ho riscontrato differenze tra le mie variazioni. Tuttavia, immagino che le prestazioni potrebbero essere un problema con database più grandi, campi più grandi, un numero maggiore di record e filtri più complessi.
Come sempre, usa la logica sopra come ha senso.
Se vuoi saperne di più sulle espressioni regolari, raccomando www.regular-expressions.info come buon sito di riferimento.
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")