2016-08-17 6 views
1

Ich versuchte herauszufinden (wie), wenn ich eine Liste von "Filter" Art von Zeichenfolge verwenden kann und es mit IN in WHERE-Klausel arbeiten. Ich hatte unten (und es funktioniert nicht natürlich):SQL-Abfrage mit IN in WHERE-Klausel

SELECT * 
FROM Table1 
WHERE Table2.[Filter String] 

[Filter String] hier ist eigentlich eine Liste und speichert verschiedene Arbeits aber Wildcard Kriterien Formate, wie zB:

[Facility] Like '*CityName*' 

oder

[Facility] Like '*CityName*' AND [ProductionLine] Like 'LineName*' 

Die meisten Anwendungsfälle von anderen Threads, die normalerweise mit oder

zusammenarbeiten
IN (SELECT * FROM table WHERE field=xx etc... 

In meinem Fall musste mit einem Datenfeld mit "ändernden Kriterien" auf Benutzereingaben arbeiten. Wie würden Sie diese SQL-Abfrage strukturieren?

+0

es ist sehr schwer zu wissen, was Sie fragen ... – Isaac

+0

So etwas: http://stackoverflow.com/a/1865426/1258492 – RAY

Antwort

0

Wenn ich richtig verstehe, können Sie eine Unterabfrage verwenden:

SELECT t1.* 
FROM Table1 as t1 
WHERE EXISTS (SELECT 1 
       FROM Table2 as t2 
       WHERE t1.facility LIKE t2.[Filter String] 
      ); 
+0

@ Gordon, [Filter String] Hier ist eine Liste mit dynamischen Feld und Wert (dh Filtertyp der Zeichenfolge) –

1

Sie erscheinen versuchen zu werden, um eine Abfrage mit einer dynamischen Auswahl-Klausel zu verwenden.

Dies ist in einer einfachen SQL-Abfrage nicht möglich, da die SQL-DML nur parametrisierte Werte in den Ausdrücken eines Ausdrucks zulässt.

Im SQL-Server können Sie eine Abfrage des von Ihnen vorgeschlagenen Typs mit der EXECUTE-Anweisung erstellen. Es kann einen Zeichenfolgenparameter akzeptieren, der beim Ausführen der Abfrage ausgewertet wird.

Beachten Sie, dass dies häufig zu Leistungseinbußen führt, da der Abfrageausführungsplan jedes Mal erstellt und kompiliert wird. Eine parametrisierte Abfrage benötigt diesen Overhead nicht.

+0

@ Pekka, danke für die Informationen. Dies ist leider in MS Access 2010 Umgebung. Hoffte, wenn es eine Arbeit gibt. –

+0

@Melvin Sie könnten verlangen, dass der Benutzer eine Liste von Werten in einer anderen Tabelle aufzeichnet und dann seinen Inhalt anfügt. Dies führt schnell zu einer großen Mission durch (in Betracht ziehen mehrere Benutzer, der gleiche Benutzer aus mehreren Sitzungen) und möglicherweise nicht attraktiv. Sie können natürlich auch die Ergebnismenge auf dem Client filtern, wenn das Gesamtvolumen nicht verwaltbar ist. Wenn in der Anwendung VBA vorhanden ist, können Sie die Abfragen im Code generieren, wobei Sie die SQL-Injektionsprobleme vermeiden. – Pekka

0

Below Abfrage Hilfe sein kann, um Ihr Problem zu lösen:

declare @Query varchar(max) 
set @Query = 'SELECT * FROM Table1 WHERE Table2.'+ @Column_Name +' in ('+ @Value_List +')' 
exec(@Query)