2009-06-23 6 views
7

Ich verwende eine SELECT-Anweisung in T-SQL auf einem Tisch ähnlich wie diese:SQL: Verwenden Sie mehrere Werte in einzelnen SELECT-Anweisung

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')) 

Dies scheint gut zu funktionieren, wenn für eine application_id oder ein location_id Suche , aber was ist, wenn ich die Anweisung für mehrere Standorte ausführen möchte? Ich möchte alle Ergebnisse für eine unbekannte Anzahl von location_id's und application_id's zurückgeben. Zum Beispiel, wenn ich jemanden auf der location_id 2, 3, 4, 5 aber mit nur einer Anwendungs-ID suchen wollte. Wie würde ich das tun?

Vielen Dank im Voraus!


EDIT: Ich bin ein Idiot! Ich habe es leicht gemacht, ohne Ihnen alle Details zu geben. Alle diese Werte werden innerhalb einer Tabelle angegeben. Der Benutzer muss die IDs aus einer Spalte in der Tabelle auswählen, anstatt sie einzufügen. Nach ein wenig Forschung zu diesem Problem I came up with a page schien eine tragfähige Lösung zu tout.

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 jemand mir helfen, dieses zu perfektionieren, um meine Bedürfnisse zu erfüllen? Entschuldigung, wenn meine Frage nicht sehr klar ist, da ich mich selbst bemühe, mich damit auseinander zu setzen.


EDIT 2: Nach etwas mehr Lesung zu dem Thema zu tun scheint es, dass ich eine gespeicherte Prozedur muß dies zu tun. Der Code oben scheint das zu sein, was ich brauche, aber ich habe Probleme, ihn an meine Bedürfnisse anzupassen. Die Tabellenstruktur ist wie folgt:

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

Laut dem Artikel, den ich nur verknüpft haben:

„Der richtige Weg, um die Situation der Handhabung ist eine Funktion zu verwenden, dass die Zeichenfolge auspackt Hier ist eine sehr einfache solche Funktion in eine Tabelle:“

so scheint es, dass ich diese Werte in einen String auspacken müssen und geben sie durch die Nutzung dieser gespeicherten proc. edure. Irgendeine Idee, wie ich das zur Arbeit bringen kann?

EDIT 3: Ich habe es mit charindex() und convert() gelöst, während sie oben gesetzt. Vielen Dank für Ihre Hilfe und ich entschuldige mich nochmals dafür, dass ich Schmerzen habe.

+0

Durch die Veröffentlichung der Tabellendefinition und einiger Beispielzeilen, Abfragen und erwarteter Antworten würde sich die Qualität der Antworten verbessern. – Andomar

+0

Entschuldigung dafür, dass ich keine vollständige Erklärung gegeben habe, nur ein paar technische Schwierigkeiten zu erleben, während ich mir mit diesem Problem den Kopf zerbringe. –

+0

Es ist immer noch nicht klar, was das Problem ist. Ist das Problem, dass Sie nicht tun können, was Sie tun möchten (warum können Sie nicht einfach die IN-Anweisung im Code von den Benutzereingaben erstellen?) - oder sind Sie besorgt über die Sicherheitsprobleme, die durch den verlinkten Artikel aufgeworfen werden? Ich würde mich nur um Letzteres kümmern, wenn das eine App ist, die im Internet sitzt. –

Antwort

17

Einsatz in wie folgt:

location_id IN ('2', '3', '4', '5') 
0

Sie können eine IN-Klausel wie folgt: -

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 in ('2', '3', '4', '5'))) 
3

Ich bin nicht sicher, ob ich die "EDIT" Teil Ihrer verstanden Frage richtig, aber meinst du sowas?

SELECT DISTINCT name, location_id, application_id 
FROM apps 
WHERE location_id IN 
(
    SELECT id FROM other_table 
) 

EDIT:
Nun, da ich Ihre zweite bearbeiten lesen, bin ich immer noch nicht sicher, ob ich verstehe, was man wirklich tun wollen.

Natürlich können wir Ihnen mit Ihrer gespeicherten Prozedur helfen, aber es ist eine Sache, die mir nicht ganz klar ist:

Wollen Sie uns erstellen Sie die SP helfen?
Oder möchten Sie wirklich etwas anderes tun, aber denken Sie, dass Sie es tun müssen, indem Sie einen SP erstellen, weil der Link so sagte?

Können Sie angeben, wie das erwartete Ergebnis aussieht?

+0

Ja, ich hätte gerne Hilfe mit der SP. Für dieses Skript würde ich es so mögen, dass es alle location_ids durchsuchen würde, wenn keine vorgeschlagen werden, was bedeutet, dass es die innerhalb der Spalte nehmen und diese durchstellen müsste. Wenn ich zum Beispiel nach einem Mann namens Joe King suchen würde und keine location_id angegeben wäre, würde die select-Anweisung alle von ihnen suchen. –

Verwandte Themen