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.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage