SQL IN-Anweisung - Value In (database_field)
Ein Teil einer Suchabfrage, die ich erstelle, erfordert, dass Filterwerte über eine SQL-Abfrage verarbeitet werden, um sie mit einer CSV-Liste in einem Datenbankfeld abzugleichen. (Ich habe keine Kontrolle über die Verwendung / Nichtverwendung von CSV-Listen in Datenbankfeldern und arbeite mit dem, was ich habe.) Ich habe ein wenig getestet und festgestellt, dass Sie Folgendes tun können:
Where database_field In (#CSV_list#)
Obdatabase_field
gleichgesetzt2
undCSV_list
gleichgesetzt1,2,3,4
das würde zurückkehrentrue
als Wert 2 wurde in der CSV-Liste gefunden.
Das Problem, das ich habe, ist jedoch, dass ich eine Liste von Werten mit dem Feld vergleichen muss, anstatt das Feld mit der Liste. Ich zeige dir, wie ich das gemacht habe.
<cfset URL.filter_sizes = [2,4,7,10]>
<cfif IsDefined("URL.filter_sizes")>
<cfset filterList = mid(URL.filter_sizes, 2, len(URL.filter_sizes) - 2)>
And (
<cfloop list="#filterList#" index="filter_item">
<cfqueryparam cfsqltype="cf_sql_varchar" value="#filter_item#"> In
(item_sizes)
<cfif listLast(filterList, ",") neq filter_item>
Or</cfif>
</cfloop>
)
</cfif>
Nun, einige von euch denken vielleicht: "Oh mein Gott, das ist eine SEHR ineffiziente Art, Dinge zu tun. Ich weiß, aber eine Sache, die ich durch Ausprobieren herausgefunden habe, ist, dass ich immer einen Weg finde, diese Methode zu optimieren, sobald sie funktioniert Es macht keinen Sinn, Perfektion zum ersten Mal auf etwas zu zielen, das ich noch nie zuvor ausprobiert habefilterList
Variable und prüft jeden Wert gegen dieitem_sizes
Feld, um festzustellen, ob der Wert in dieser CSV-Liste enthalten ist.
Hier ist der Haken. Obitem_sizes
gleichgesetzt2
, toll, denn einer der Werte wäre2
und es würde stimmen. Jedoch, wennitem_sizes
gleichgesetzt2,3,4
, obwohl zwei meiner variablen Werte sind2
und4
, es passt nicht zumSTRING von2,3,4
(etwas, was ich gefunden habe, passiert durch Ausprobieren). Meine Vermutung ist, dass, obwohl ich den Wert links und das Feld rechts gesetzt habe, es immer noch die Linie als läuftitem_sizes In (#filter_item#)
Dies ist die einzige logische Antwort, die ich finden könnte.
Hat jemand eine Idee, wie ich dieses Problem lösen könnte (ohne die Datenbank zu normalisieren, da dies zum gegenwärtigen Zeitpunkt nicht möglich ist), indem ich die oben verwendete Methode verwende?
LÖSUNG
Wie in den Kommentaren erwähnt, habe ich eine provisorische Lösung für dieses Problem gefunden. Es ist nicht das Beste, aber es funktioniert.
Mit der folgenden Syntax können Sie die gewünschten Ergebnisse erzielen:
<cfset URL.filter_sizes = [2,4,7,10]>
<cfif IsDefined("URL.filter_sizes")>
<cfset filterList = mid(URL.filter_sizes, 2, len(URL.filter_sizes) - 2)>
And (
<cfloop list="#filterList#" index="filter_item">
',' + item_sizes + ',' Like
<cfqueryparam cfsqltype="cf_sql_varchar" value="%,#filter_item#,%">
<cfif listLast(filterList, ",") neq filter_item> Or</cfif>
</cfloop>
)
</cfif>
BITTE BEACHTEN SIE
Die Verwendung von<cfset URL.filter_sizes = [2,4,7,10]>
soll emulieren, wie die tatsächliche URL-Variable lauten würde (nach der Bearbeitung). Dies ist kein Fehler, bei dem ich astruct
innerhalb einer URL-Variablen.