2009-12-07 10 views

Répondre

2

Si vous essayez d'utiliser l'ensemble dans une déclaration IN, au lieu de diviser la chaîne, vous pouvez faire une comparaison comme:

SELECT * FROM `table` WHERE 'the,quick,brown,fox' REGEXP CONCAT('(^|,)','word','(,|$)'); 

Je ne suis pas sûr de savoir comment efficace Ce serait le cas si votre ensemble de données est grand, mais il pourrait être plus rapide que de lire et de sélectionner dans une table temporaire.

1

testé sur MySQL 5.1.41:

DROP TABLE IF EXISTS n; 
CREATE TEMPORARY TABLE n AS 
    SELECT -1 AS N UNION 
    SELECT -2 UNION 
    SELECT -3 UNION 
    SELECT -4 UNION 
    SELECT -5; 

DROP TABLE IF EXISTS foo; 
CREATE TABLE foo AS 
    SELECT 'the,quick,brown,fox' AS csv; 

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(foo.csv, ',', n.n), ',', 1) AS word 
FROM foo JOIN n 
    ON (LENGTH(REPLACE(foo.csv, ',', ''))-LENGTH(foo.csv) <= n.n+1); 

Résultat:

+-------+ 
| word | 
+-------+ 
| fox | 
| brown | 
| quick | 
| the | 
+-------+ 
0

Ne serait-FIND_IN_SET résoudre votre problème?

FIND_IN_SET()

+0

FIND_IN_SET est extrêmement lent, car il force une analyse complète – dresende

Questions connexes