C'è un modo per farlo in SQL, ma è piuttosto complicato. Supponendo che tu possa convivere con una stringa che va fino a, ad esempio, tre nomi di frutta, procedi nel modo seguente.
si assume che @fruits
è la variabile varchar
contenente l'elenco dei frutti, a cui aggiungere altre delimitatori virgola (nel caso in cui esso contiene meno di tre nomi di frutta):
declare @fruits varchar(80);
set @fruits = <list of fruits passed in> + ',_,_,_,';
Le seguenti equazioni non sono SQL , ma la matematica dietro le operazioni di sottostringa avremo bisogno per i like
espressioni:
NOTE: NOT SQL
First fruit word:
p1 = charindex(',', @fruits) << position of ',' delimiter
v1 = substring(@fruits, 0, p1-1) + '%' << fruit word we seek
r1 = substring(@fruits, p1+1) << remainder of string
Second fruit word:
p2 = charindex(',', r1)
v2 = substring(r1, 0, p2-1) + '%'
r2 = substring(r1, p2+1)
Third fruit word:
p3 = charindex(',', r2)
v3 = substring(r2, 0, p3-1) + '%'
r3 = substring(r2, p3+1)
...and so on...
Ora sostituiamo i primi valori di p1
, v1
e r1
nella seconda serie di equazioni per p2
, e r2
. Allo stesso modo, sostituiamo questi secondi valori nel terzo insieme e così via. Finiamo con queste mostruosità per v1
, v2
, e v3
:
v1 = substring(@fruits, 0, charindex(',', @fruits)-1) + '%'
v2 = substring(substring(@fruits, charindex(',', @fruits)+1), 0, charindex(',', substring(@fruits, charindex(',', @fruits)+1))-1) + '%'
v3 = substring(substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1), 0, charindex(',', substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1))-1) + '%'
Queste sono le prime tre LIKE
valori che dobbiamo cercare:
select * from fruits
where fruit like <v1>
or fruit like <v2>
or fruit like <v3>
completamente espanso, la query è:
select * from fruits
where fruit like substring(@fruits, 0, charindex(',', @fruits)-1) + '%'
or fruit like substring(substring(@fruits, charindex(',', @fruits)+1), 0, charindex(',', substring(@fruits, charindex(',', @fruits)+1))-1) + '%'
or fruit like substring(substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1), 0, charindex(',', substring(substring(@fruits, charindex(',', @fruits)+1), charindex(',', substring(@fruits, charindex(',', @fruits)+1))+1))-1) + '%'
Possiamo fare più lavoro per estrarre la 4a parola, 5a parola, 6a parola e così via, per quanto ci piace. Ma ogni ulteriore valore di vN
diventa molto più complicato del precedente.
Nota: non ho provato questa soluzione, l'ho provata solo matematicamente.
Che cosa significa "frutti"? Non dire valori separati da virgola. Questo è un design molto, molto povero per un database relazionale. –
Sto solo usando una semplice tabella per l'illustrazione. – user3015739
Hai un problema fondamentale con la tua struttura dati. Non dovresti memorizzare elenchi di cose come stringhe. Invece, dovresti usare una tabella di giunzione. –