2016-04-17 5 views
0

Fehler beim Abrufen der korrekten Ergebnisse von meiner Abfrage.SQL Verwenden mehrerer AND & OR in derselben Abfrage

Mein Hauptproblem ist, dass ich eine Spalte namens Filterliste haben, die Daten in diesem Format enthält [space]NUMBER[space]

| 2 | 16 | 7 | 

Ich brauche alle Produkte auszuwählen, die meine erste Abfrage mit dieser Wo-Anweisung entsprechen -

WHERE  
    (dept = '5') AND (active = 1) AND (Manufacturer = 'A Company') 

Dann muss ich folgendes hinzufügen, um Datensätze zu finden, in denen die Spalte filterlist einen der String-Werte [space]NUMBER[space] enthält -

Die vollständige SQL Ich habe versucht, mit ist

SELECT * 
FROM products 
WHERE 
    ((dept = '5') AND (active = 1) AND (Manufacturer = 'A Company')) 
    AND ((CHARINDEX(' 3 ', filterlist) > 0) OR 
     (CHARINDEX(' 34 ', filterlist) > 0) OR 
     (CHARINDEX(' 64 ', filterlist) > 0)) 

Also ich bin auf der Suche, um alle Aufzeichnungen zu erhalten, die Abteilung als 5 haben, ist aktiv, hergestellt von "A Gesellschaft und dass die Spalte Filterliste enthält entweder 3,34 oder 64 (als Beispiel)

UPDATE: alles funktioniert mit diesem Teil fein:

WHERE 
((dept = '5') AND (active = 1) AND (Manufacturer = 'A Company')) 
AND ((CHARINDEX(' 3 ', filterlist) > 0) 

aber zieht in andere Datensätze aus der falschen Dept/Hersteller, wenn dieser Abschnitt hinzugefügt wird

OR 
    (CHARINDEX(' 34 ', filterlist) > 0) OR 
    (CHARINDEX(' 64 ', filterlist) > 0)) 

Ich wäre sehr dankbar, wenn mir jemand in Richtung zeigen könnte, wie dies getan werden kann.

+0

Der Code sieht okay für mich aus. Ich bin neugierig, die Daten zu überprüfen. Können Sie ein http://sqlfiddle.com/ Beispiel einrichten die Tabellenstruktur und einen Datensatz oder zwei? – user212514

+0

noch nie zuvor verwendet, aber wird auf die Einrichtung von sqlfiddle Konto jetzt –

+0

haben sqlfiddle http://sqlfiddle.com/#!3/109814/1 –

Antwort

1
  1. Könnten Sie numerische Felder in numerischen Typen beibehalten?
  2. wenn nicht möglich, dann können Sie diese verwenden

    SELECT * 
    FROM products 
    WHERE ((dept = '5') AND (active = 1) AND (Manufacturer = 'A Company')) 
    AND ltrim(rtrim(filterlist)) in ('3','34','64') 
    
+0

Produziert keine Ergebnisse, müssen nicht Räume loswerden müssen nur mit jeder Zeile mit CHARINDEX für das Vorhandensein der Str. Suchen –

0

Vielen Dank für Ihre SQLFiddle zu schaffen. Diese Abfrage gibt die zwei Zeilen zurück, die 'A Company' haben, also denke ich, dass es korrekt ist (Ich entfernte dept, weil es nicht in products war, aber das macht keinen Unterschied in diesem Beispiel, weil wir immer noch die gleichen logischen Kombinationen haben , nur eine weniger). Zusätzlich

SELECT * 
FROM products 
WHERE 
    ((active = 1) AND (Manufacturer = 'A Company')) 
    AND ((CHARINDEX(' 3 ', filterlist) > 0) OR 
     (CHARINDEX(' 34 ', filterlist) > 0) OR 
     (CHARINDEX(' 64 ', filterlist) > 0)) 

wenn ich Manufacturer = 'B Company' geändert habe ich nur die dritte Platte.

Es macht Sinn für mich ... Vermisse ich etwas?