Cercando una colonna contenente dati CSV in una tabella MySQL per l'esistenza di valori di input
Domanda
Non ho voce in capitolo tavolo, VOCE, in MySQL che memorizza i dati nel seguente modo:
ID FEATURES
--------------------
1 AB,CD,EF,XY
2 PQ,AC,A3,B3
3 AB,CDE
4 AB1,BC3
--------------------
Come ingresso, mi metterò una stringa CSV, qualcosa come "AB, PQ". Voglio ottenere i record che contengono AB o PQ. Mi sono reso conto che abbiamo scrivere una funzione MySQL per raggiungere questo obiettivo. Quindi, se abbiamo questa funzione magica MATCH_ANY definita in MySQL che fa questo, vorrei poi semplicemente eseguire uno SQL come segue:
select * from ITEM where MATCH_ANY(FEAURES, "AB,PQ") = 0
La query sopra sarebbe restituire i record 1, 2 e 3.
Ma io corro in ogni sorta di problemi durante l'implementazione di questa funzione come mi sono reso conto che MySQL non supporta gli array e non c'è modo semplice per le stringhe di Spalato sulla base di un delimitatore.
ritocca il tavolo è l'ultima opzione per me in quanto comporta sacco di problemi.
Potrei anche voler eseguire le query che contengono molteplici funzioni MATCH_ANY come ad esempio:
select * from ITEM where MATCH_ANY(FEATURES, "AB,PQ") = 0 and MATCH_ANY(FEATURES, "CDE")
Nel caso precedente, si otterrebbe un incrocio di record (1, 2, 3) e (3) che, può andare 3.
Ogni aiuto è molto apprezzato.
Grazie
Soluzione
Prima di tutto, la banca dati dovrebbe, naturalmente, non contengono valori separati da virgola, ma siete consapevoli di questo si spera già. Se la tabella è stata normalizzata, si potrebbe facilmente ottenere gli oggetti utilizzando una query del tipo:
select distinct i.Itemid
from Item i
inner join ItemFeature f on f.ItemId = i.ItemId
where f.Feature in ('AB', 'PQ')
E 'possibile abbinare le stringhe nel valori separati da virgola, ma non è molto efficiente:
select Id
from Item
where
instr(concat(',', Features, ','), ',AB,') <> 0 or
instr(concat(',', Features, ','), ',PQ,') <> 0
Altri suggerimenti
select *
from ITEM where
where CONCAT(',',FEAURES,',') LIKE '%,AB,%'
or CONCAT(',',FEAURES,',') LIKE '%,PQ,%'
o creare una funzione personalizzata per fare la tua MATCH_ANY
Per tutti gli amanti REGEXP là fuori, ho pensato di aggiungere questo come una soluzione:
SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]';
e per la sensibilità caso:
SELECT * FROM ITEM WHERE FEATURES REGEXP BINARY '[[:<:]]AB|PQ[[:>:]]';
Per la seconda query:
SELECT * FROM ITEM WHERE FEATURES REGEXP '[[:<:]]AB|PQ[[:>:]]' AND FEATURES REGEXP '[[:<:]]CDE[[:>:]];
Cheers!
In alternativa, è possibile utilizzare RLIKE ()
select *
from ITEM
where ','+FEATURES+',' RLIKE ',AB,|,PQ,';
Solo un pensiero:
ha a che fare in SQL? Questo è il genere di cosa che si potrebbe normalmente aspettare di scrivere in PHP o Python o qualunque linguaggio si sta utilizzando per interfacciarsi con il database.
mezzi questo approccio si può costruire lo stringa di query utilizzando qualsiasi logica complessa che serve e poi basta inviare una vaniglia query SQL, piuttosto che cercare di costruire una procedura in SQL.
Ben