Cercando una colonna contenente dati CSV in una tabella MySQL per l'esistenza di valori di input

StackOverflow https://stackoverflow.com/questions/2857024

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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top