SQL: mehrere Werte in einzelnen SELECT-Anweisung

Bin ich mit einer SELECT-Anweisung in T-SQL auf eine Tabelle ähnlich dieser:

SELECT DISTINCT name, location_id, application_id FROM apps
WHERE ((application_id is null) or (application_id = '4'))
AND ((location_id is null) or (location_id = '3'))

Dieser scheint gut zu funktionieren, wenn Sie auf der Suche nach einem application_id oder eine location_id, aber was ist, wenn ich laufen will-Anweisung für mehrere Standorte? Ich will, um alle Ergebnisse für eine unbekannte Menge an location_id ' s und application_id ist. Zum Beispiel, wenn ich wollte, um die Suche für jemanden, der an der location_id ' s 2, 3, 4, 5, aber mit nur einem application_id. Wie kann ich dies tun?

Vielen Dank im Voraus!


EDIT: ich bin ein idiot! Ich habe es einfach klingen, ohne dass Sie alle details. Alle diese Werte sind aus den in einer Tabelle. Der Benutzer muss wählen Sie die id ' s aus einer Spalte in der Tabelle anstelle von einfügen. Nachdem ich ein wenig Forschung auf dies problem, das ich kam mit einer Seite das schien tout eine praktikable Lösung.

CREATE FUNCTION iter$simple_intlist_to_tbl (@list nvarchar(MAX))
   RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
  RETURN
END

Kann mir jemand helfen, perfekt zu meinen Anforderungen entsprechen? Sorry, wenn meine Frage nicht ganz klar, wie ich zu kämpfen, um sich mit es selbst.


EDIT 2: Nachdem ich ein wenig mehr zu Lesen über das Thema, es scheint, dass ich brauche eine gespeicherte Prozedur, dies zu tun. Der code oben zu sein scheint, was ich brauche, aber ich habe Schwierigkeiten, Schneiderei es um meine Bedürfnisse. Die Struktur der Tabelle ist wie folgt:

application_id   name                  location_id
------------------------------------------------------
1                Joe Blogs             34
2                John Smith            55

Laut dem Artikel habe ich gerade verlinkt:

"Der richtige Umgang mit der
situation ist die Verwendung einer Funktion, die
packt den string in eine Tabelle ein. Hier
ist eine sehr einfache solche Funktion:"

So, es scheint, dass ich brauche, um zu packen Sie diese Werte in eine Zeichenfolge und übergeben Sie Sie durch die Verwendung dieser gespeicherten Prozedur. Irgendeine Idee, wie kann ich diese zu arbeiten?

EDIT 3: ich habe es geschafft, es zu lösen mit charindex () - und convert(), während Einstellung, die Sie an der Spitze. Vielen Dank für all deine Hilfe und ich entschuldige mich nochmals Schmerzen.

  • Die Buchung der Tabelle definition und einige Beispiel-Zeilen, Abfragen und die erwarteten Antworten verbessern die Qualität der Antworten.
  • Wir entschuldigen uns für die nicht zu geben, eine vollständige Erklärung, nur erleben ein paar technische Schwierigkeiten, während ich ' m Regale mein Gehirn mit diesem problem.
  • Es ist immer noch nicht klar, was das problem ist. Das problem kann man einfach nicht tun, was Sie tun möchten (warum kann man nicht einfach bauen, die IN-Anweisung im code aus der user-Eingabe?) - oder sind Sie besorgt über die Sicherheit Probleme, die durch die verlinkten Artikel? Ich würde nur wirklich sorgen über die zweite, wenn dieses ist eine app, die sitzen auf dem internet.
  • Das problem ist, so wie es in dem Artikel. Ich bekomme diese Art von Fehler bei der Verwendung IN "Syntaxfehler konvertieren den varchar-Wert '9, 12, 27, 37' in einer Spalte mit Daten geben int." Diese location_id ' s überprüft werden müssen unter denen, die vorhanden sind, in der Spalte in der Datenbank und diese ist für eine web-Anwendung. Nach einem Blick auf dieses Verfahren der wichtigste Punkt für mich zu sein scheint, charindex(). Ich möchte in der Lage sein, um eine Tabelle aus dieser "Liste" der pre-Werte eingefügt, so dass Sie überprüft werden können.
  • Klingt wie Sie gebaut haben, die IN wie folgt: IN ('9, 12, 27, 37') und Ihre zugrunde liegenden Spalte ist ein int (wie es schien). Versuchen Sie es mit: IN (9, 12, 27, 37). Keine Zitate.
  • Das funktioniert auch, könnte aber ziemlich chaotisch, da alle diese Werte müssen überprüft werden, was bereits vorhanden ist und die große Menge an diese Zeilen. Gibt es nicht eine Möglichkeit, ich könnte es tun, in die gleiche Richtung wie der Artikel, den ich gelinkt hast hat es? Im IRC habe ich schon vorgeschlagen, charindex().
  • Ich glaube, ich bin noch hier etwas fehlt. Wenn Sie eine MENGE von zahlen, die in den IN, dann denke ich, dass die andere option wäre die Verwendung einer temp-Tabelle oder eine Tabellenvariable... aber wie werden diese zahlen ermittelt? Ich hatte den Eindruck, der Benutzer auswählen, diese Werte in die Abfrage - aber so viele?
  • Der Benutzer kann zahlen vorlegen, aber ich würde es gerne so, dass wenn die zahlen nicht Hinzugefügt, dass die select-Anweisung würde die Suche durch jeden location_id. Zum Beispiel, wenn ich waren auf der Suche für jemanden und nicht noch ein location_id die SP sollte dann die Suche durch jedes einzelne location_id.
  • Ich habe es geschafft, lösen Sie es nach dem Lesen bei Google (anhand von dem Geplänkel hier). Vielen Dank für Ihre Hilfe!
  • Die einfachste Lösung wäre, erstellen Sie die Abfrage ohne die location_id-Klausel, wenn keine location_id ausgewählt wurde (WO application_id-Klausel nur dann) bringt alles wieder zurück. Ist das machbar innerhalb Ihrer situation? Eine weniger elegante Lösung vorzulegen, -1 für "nichts ausgewählt", um die folgende WHERE-Klausel: (location_id IN (Werteliste) ODER -1 IN (Wert, Liste)), die ist immer wahr, wenn -1 wird in den ausgewählten Werten.
  • Ich habe eingestellt, und erklärt die notwendigen Werte an der Spitze und verwendet charindex () - und convert() zu sagen, wenn es etwas gibt, innerhalb dieses neu deklarierte Satz, der passt. Der Vorschlag, für die Sie IN mir die Fähigkeit zu verwenden, und jetzt ist es funktioniert sowohl für int und varchar, wenn ich entscheiden, zu erweitern Sie die Tabellen. Dank dieser habe ich akzeptiert Ihre Antwort, denn es war im Grunde das, was ich tun musste.
  • Thx - wie Sie haben, wo Sie benötigt zu bekommen, das ist die Hauptsache.

InformationsquelleAutor Mike B | 2009-06-23
Schreibe einen Kommentar