Parameter in der Abfrage mit in-Klausel?
Ich möchten, verwenden Sie den parameter für die Abfrage wie diese :
SELECT * FROM MATABLE
WHERE MT_ID IN (368134, 181956)
so, ich denke, über diesen
SELECT * FROM MATABLE
WHERE MT_ID IN (:MYPARAM)
aber es funktioniert nicht...
Gibt es eine Möglichkeit, dies zu tun ?
Ich eigentlich verwenden Sie IBX und Firebird 2.1
Ich weiß nicht, wie viele Parameter in der IN-Klausel.
AFAIK SQL selbst nicht erlauben, Parameter in Klauseln. Einige workarounds funktioniert, siehe andere Antworten, aber seien Sie sich bewusst von SQL-injection-Risiken.
Ich habe vor kurzem versucht, das gleiche zu tun, mit MS SQL Server und das hat nicht funktioniert entweder.
Ich habe vor kurzem versucht, das gleiche zu tun, mit MS SQL Server und das hat nicht funktioniert entweder.
InformationsquelleAutor Hugues Van Landeghem | 2009-11-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Landete ich mit einer globalen temporären Tabelle in Firebird, einfügen von Parameterwerten ersten und zum abrufen von Ergebnissen, die ich mit einem regulären
JOIN
statt einerWHERE ... IN
- Klausel. Die temporäre Tabelle ist vorgangsbezogen und geräumt, commit (ON COMMIT DELETE ROWS
).InformationsquelleAutor Ondrej Kelle
Für wen auch immer ist, noch interessiert. Ich habe es in Firebird 2.5 mit einer anderen gespeicherten Prozedur inspiriert von diesem post.
Wie teilt man durch Komma getrennte Zeichenfolge innerhalb der gespeicherten Prozedur?
Wenn Sie übergeben die SP der folgenden Liste
CommaSeperatedList = 1,2,3,4
- und call -
das Ergebnis wird sein :
Und kann wie folgt verwendet werden:
RESULT = :TEMPSTR;
durch dieseRESULT = cast(:TEMPSTR as integer);
.InformationsquelleAutor Plofstoffel
Vielleicht sollten Sie wite es so:
Ich schon machen, aber das habe ich zum erstellen von SQL von hand, das hängt davon ab, wie viele Parameter, die ich brauche. Ich will nur von SQL
InformationsquelleAutor Yurish
Ich glaube nicht, dass es etwas, das getan werden kann. Gibt es einen bestimmten Grund, warum Sie nicht möchten, bauen Sie die Abfrage selbst?
Ich habe diese Methode ein paar mal, es spielt keine Parameter verwenden, though. Es verwendet eine stringlist, und es die Eigenschaft DelimitedText. Erstellen Sie eine IDList, und füllen Sie es mit Ihren IDs.
ja, es ist schrecklich falsch, wenn wir reden über Benutzereingaben, aber ich habe die Vermutung, dass, da es eine Liste von IDs, es ist nicht etwas, das Benutzer liefern würde. In diesem Fall hätte ich erwartet, Produkt-codes, Rechnung zahlen etc. Es kann ein Fehler gewesen sein von mir und ich danke dir für die Verbesserung meiner Antwort.
Sie mögen Recht haben, dass in diesem speziellen Fall SQL-injection nicht möglich sein kann, aber es ist eine echte Bedrohung zu sein scheint, so schwierig für die Menschen zu verstehen / denken Sie daran, dass ich denke, man sollte konsequent sein und nicht Dinge tun, wie diese, überhaupt.
+1. Wenn die
IN
Liste ist relativ kurz, Dies ist der einfachste und Schnellste Ansatz IMHO. (SQL-injection vermieden werden können, wenn Sie darauf achten, was du tust)InformationsquelleAutor johnny
Könnten Sie auch interessieren, bei der Lektüre der folgenden Schritte aus:
http://www.sommarskog.se/dynamic_sql.html
und
http://www.sommarskog.se/arrays-in-sql-2005.html
Deckt dynamische sql mit " in " - Klauseln und alle Arten. Sehr interessant.
InformationsquelleAutor shunty
Parameter sind Platzhalter für einzelne Werte, das bedeutet, dass eine Klausel akzeptiert, die eine durch Komma getrennte Liste von Werten, nicht mit Parametern.
Denken Sie an es auf diese Weise: wo immer ich einen Wert, kann ich mit einem parameter.
So, in einer Klausel wie: IN (:param)
Kann ich binden der variable an einen Wert, sondern nur 1 Wert, z.B.: IN (4)
Nun, wenn Sie denken, dass eine "IN-Klausel value-Ausdruck", erhalten Sie eine Zeichenfolge von Werten: IN (1, 4, 6) -> das sind 3 Werte mit Kommas zwischen Ihnen. Das ist ein Teil des SQL-Strings, die nicht Teil von einem Wert, der ist, warum es nicht gebunden werden kann, die durch einen parameter.
Offensichtlich ist dies nicht das, was Sie wollen, aber es ist das einzige, was möglich ist mit Parametern.
InformationsquelleAutor Martijn Tonies
Die Antwort von Yurish ist eine Lösung in zwei von drei Fällen:
Aber wenn Sie wollen, um die beliebige Anzahl der Elemente, und manchmal keine Elemente, dann können Sie erzeugen SLQ-Anweisung on-the-fly. Mit format hilft.
Ich glaube nicht, dass das möglich ist, aber ich Wünsche mir, dass ich falsch bin. Ich wollte genau das tun und sich für das schreiben der SQL-mich. Vorbereitete Abfragen machen nur Sinn in der DB-engine weiß, was zu erwarten ist (wie viele Parameter sowie Ihre jeweiligen Arten). Selbst Wenn es einen Weg zum einstellen beliebiger Anzahl von ein-ich denke, es wäre keine Leistungssteigerung im Vergleich zu nur "überraschend" der DB Motor mit dem frischen Abfrage jedes mal.
Die Verwendung von Parametern ist nicht nur für performance-Gewinne, ist es notwendig, den Schutz vor SQL-injection-Angriffe. Entweder Sie verbringen eine Menge Aufwand bereinigen Sie Ihre Eingabe parameter strings, oder Sie behandeln Sie, wie die Parameter sind.
"Notwendig" nur, wenn der SQL Fall in Frage, ist anfällig zu einem injection-Angriff. Wenn der SQL formatiert ist, durch die code-Umwandlung von ganzzahligen Werten im Arbeitsspeicher Eigenschaften (.ID) eines Objektes(s) zum einbetten in einigen literalen SQL-Anweisung dann das Potenzial für eine injection-Angriff ist vernachlässigbar. Nur weil eine Frage beinhaltet, SQL und Parameter bedeutet nicht, dass alle Anliegen mit SQL und Parameter unbedingt gelten. afaic Leistung ist die einzige bedeutende Sorge ist in diesem Fall imho, und ich würde vorsichtig sein, vorausgesetzt, dass formatierte SQL wäre inakzeptabel, dass die Punktzahl ohne zu testen.
Ich denke, es ist besser, sich zu irren auf der Seite der Vorsicht. Ich glaube nicht, dass die Entwickler eine Gründliche Risiko-Analyse jedes mal, wenn Sie bauen SQL-Anweisungen wie diese. Deshalb ist es IMHO besser, völlig verlassen die Praxis.
InformationsquelleAutor Mihaela
SELECT * FROM MATABLE
WO MT_ID IN (:MYPARAM) anstatt MYPARAM mit :, verwenden Sie den parameter name.
wie SELECT * FROM MATABLE
WO MT_ID IN (SELECT REGEXP_SUBSTR(**MYPARAM,'[^,]+', 1, EBENE)
VON DUAL
DIE VERBINDUNG VON REGEXP_SUBSTR(MYPARAM, '[^,]+', 1, EBENE) IST NICHT NULL))**
MYPARAM- '368134,181956'
InformationsquelleAutor Rajesh D
Wenn Sie Oracle verwenden, dann sollten Sie definitiv check out Tom Kyte ' s blog-post über genau dieses Thema (link).
Folgenden Herr Kyte s führen, hier ein Beispiel:
Wo Sie binden würde
:MYPARAM
zu'368134,181956'
in Ihrem Fall.InformationsquelleAutor Tom
Hier ist eine Technik, die ich in der Vergangenheit verwendet haben, um zu bekommen, die 'IN' - Anweisung problem. Es erstellt eine 'ODER' - Liste basierend auf der Anzahl der angegebenen Werte mit den Parametern (einzigartig). Dann alles, was ich zu tun hatte, war, fügen Sie die Parameter in der Reihenfolge, wie Sie erschienen in der mitgelieferten Liste Wert.
Hoffe, das hilft.
Das dürfte sehr schwierig werden. Ich habe jahrelang gekämpft. Wenn Sie Komponenten, die Unterstützung von Makros können Sie dieses Ziel erreichen, aber mit Parametern, die ich bezweifle es und auf der server-Seite, ich habe nicht in der Lage gewesen, dies zu erreichen.
InformationsquelleAutor yozey
Gibt es einen trick, um Umgekehrt
SQL LIKE
Zustand.Passieren Sie die Liste als string (
VARCHAR
) parameter wie'~12~23~46~567~'
Dann u-query wie
where ... :List_Param LIKE ('%~' || CAST( NumField AS VARCHAR(20)) || '~%')
InformationsquelleAutor Arioch 'The
InformationsquelleAutor Kazmirus