(CFML) Zu blöd für IN-Operator oder für CFML?
Ole
- datenbank
hi
ich durchlebe grade einen montag wie er im buche steht *seuftz*
mein aktuelles problem ist folgendes:
ich habe eine komma separierte liste mit artikelnummer z.B.
100,32423,234,324-43,123-456,4,7,10
welche aus einer datenbank kommt und deshalb meistens unterschiedlich ist, somit ist obere beispiel nur exemplarisch zu bestrachten.
dieses liste habe ich in einer variable: produkte
nun möchte ich aus einer datenbank die artikel erhalten welchen die in der liste enthalten artikelnummern entsprechen.
also habe ich mir folgende SQL-Anweisung gebastelt:
SELECT * FROM Artikel WHERE ArtNr IN ('#produkte#') ORDER BY ArtNr
#produkte# ist in diesem Falle eine CFML-Variable. diese wird vor der SQL abfrage durch den inhalt der Variable ersetzt.
Alle Listenelemente kommen in der Artikel-Tabelle vor.
Allerdings bekomme ich keine ergebnisse zurück...eine Fehlermeldung bleibt mir auch verwehrt :(
dann hab ich angefangen etwas literatur zu konsultieren und gelesen das = ANY dem IN Operator entsprechen würde (Quelle: Relationale Datenbanken und SQL, Addison-Wesley, Seite 208).
Also das ganze umgemodelt zu
SELECT * FROM Artikel WHERE ArtNr = ANY ('#produkte#') ORDER BY ArtNr
und jetzt bekomme ich auch eine fehlermeldung:
ODBC Error Code = 37000 (Syntax error or access violation)
[Microsoft][ODBC Microsoft Access Driver] Syntaxfehler. in Abfrageausdruck 'ArtVar =ANY ('100,32423,234,324-43,123-456,4,7,10')'.
Ich also weiter meine Fachliteratur inspiziert und bin in oben erwähnten Buch auf ein Beispiel gestoßen in dem die einzelnen Listenelemente in Hochkomma standen...also so:
'100','32423','234','324-43','123-456','4','7','10'
fülle ich aber die variable mit einer entsprechend formatierten Liste bekomme ich eine andere Fehlermeldung:
ODBC Error Code = 37000 (Syntax error or access violation)
[Microsoft][ODBC Microsoft Access Driver] Syntaxfehler. in Abfrageausdruck 'ArtVar =ANY ('''100'',''32423'',''234'',''324-43'',''123-456'',''4'',''7'',''10''')'.
irgendwas mache ich verkehrt und irgendwie stehe ich bei der lösung meines problemes ziemlich auf dem schlauch *seuftz*
kann mir jemand helfen?
liegt es an SQL oder ColdFusion?
ist meine Syntax irgendwo falsch?
thx
ole
(8-)>
Hi,
#produkte# ist in diesem Falle eine CFML-Variable. diese wird vor der SQL abfrage durch den inhalt der Variable ersetzt.
ich kenne CFML nicht näher. _Wie_ wird die Variable ersetzt? Als String (dann lass ihn Dir ausgeben) oder als Bindvariable? In letztem Fall beachte, dass Du nicht einen Wert übergeben möchtest, sondern acht, und deshalb auch acht Variablen brauchst.
[Microsoft][ODBC Microsoft Access Driver] Syntaxfehler. in Abfrageausdruck 'ArtVar =ANY ('100,32423,234,324-43,123-456,4,7,10')'.
[Microsoft][ODBC Microsoft Access Driver] Syntaxfehler. in Abfrageausdruck 'ArtVar =ANY ('''100'',''32423'',''234'',''324-43'',''123-456'',''4'',''7'',''10''')'.
Diese beiden Meldungen sprechen für die Bind-Theorie: Die Liste der Werte steht jeweils in Quotes und ist somit nur _ein_ Wert.
Cheatah
Hi,
hast du schon mal das Ganze mit ListQualify versucht, also
where ArtNr in (#ListQualify( produkte, ",")#)
MfG
Dark Sider
Sorry, vertippt:
where ArtNr in (#ListQualify( produkte, ",")#)
^ muß "'" sein.
MfG
Dark Sider
hi
so wies aussieht ist es wohl ein CFML problem.
wird der string ohne hochkomma um jeden listeneintrag ausgeliefert (ColdFusion unterscheidet von sich aus nicht großartig zwischen char oder integer) so wird beim ersetzen der varible durch den parser nur um den gesamten string ein hochkomma gesetzt, was dazu führt, das der ganze string als ein wert interpretiert wird, da SQL die Hochkomma um jeden einzelnen wert braucht.
Enthält der String allerdings die Hochkomma so werden die 8 Werte auch als acht Werte erkannt und wiederum in hochkamma gesetzt (warum auch immer).
die lösung ist eine ColdFusion-Funktion mit namen PreserveSingleQuotes. Diese verhindert das multiple auftreten von hochkomma in folge.
da muß man aber auch erstmal drauf kommen *seuftz*
zumindest funktioniert es jetzt.
was mich noch interessieren würde ist ob "= ANY" wirklich das gleiche bewirkt wie "IN".
thx habt mir sehr geholfen
so long
ole
(8-)>
Hi,
die lösung ist eine ColdFusion-Funktion mit namen PreserveSingleQuotes. Diese verhindert das multiple auftreten von hochkomma in folge.
Cool, die Funktion kannte ich noch gar nicht.
Ich hab bisher immer ListQualify hergenommen, das funktioniert auch.
Aber gut zu wissen...
MfG
Dark Sider