2016-05-03 7 views
1

Ich verfüge über mehrere Spalten, die eindeutige, eindeutige Bezeichner speichern, die austauschbar verwendet werden können. Ich möchte daher Datensätze auswählen, bei denen entweder Col1 oder Col2 einer Anzahl von Parametern entspricht. Ich habe folgendes versucht, und Variationen, IE, wo Col1 in (?, ?) oder .Wählen Sie Zeilen, in denen sich mehrere Spalten in den Parameterwerten befinden

SELECT * FROM Table WHERE EXISTS (Col1, Col2) IN (?, ?); 

Ich kann zur Zeit acheive dies die folgende verwenden, jedoch ist es lang und unhandlich, da sie für jede Abfrage wiederholt ? in (Col1, Col2) würde ich binden möchten.

SELECT * FROM Table WHERE ? in (Col1, Col2) OR ? in (Col1, Col2); 

Letztlich meine Abfrage kann bis zu 1000 Parameter (alle Pakete werden eindeutig sein), so dass ich frage mich, ob es eine natürliche Art und Weise ist es, die obige Abfrage zu tun?

+0

Wenn Ihre DB richtig normalisiert, dann gäbe es nur eine 'ColX' pro Zeile sein, und man konnte einfach diese Tabelle mit den Suchwerten verbinden. –

+0

@CL, dies beinhaltet externe Datenbankkennungen für Daten mit vielen Zeilen, von denen es viele gibt, sie werden synonym verwendet. Einige der Identifikatoren stammen aus verschiedenen Spezifikationen, einige sind Synonyme, einige stammen von konkurrierenden Gruppen, beziehen sich jedoch alle auf das Gleiche. Für leistungskritische Aufgaben verwende ich bereits einige Regexes, um den ID-Typ zu identifizieren und anschließend Abfragen getrennt zu verarbeiten. Wenn Leistung jedoch kein Problem ist, habe ich mich gefragt, ob es einen faulen Weg gab. Ein Join wäre hier nicht geeignet. (Ich verstehe das ist ungewöhnlich). –

+0

@CL, sorry, viele Spalten (und viele Daten in der Spalte). –

Antwort

0

Ich würde in using full-text-index tables (FTS) suchen. Sie können den Operator MATCH verwenden, um mehrere Suchbegriffe anzugeben.

SELECT * from Table WHERE (Col1 MATCH 'this OR that OR something') 
         AND (Col2 MATCH 'this OR that OR something'); 
+0

Dies würde immer noch erfordern, dass ich die Parameter für jede Spalte nach meinem Verständnis neu bette, oder verwende dann eine String-Formatierung, um sie in die Abfrage einzufügen. –

+0

Haben Sie die Verkettung der Spalten in Betracht gezogen? Sie können "SELECT (col1 || col2) AS both_cols FROM Table" als Unterabfrage vor der MATCH-Anweisung einfügen. – Michael

+0

Michael, ich habe, aber dann würde das Wildcard-String-Match erfordern. Keine der Optionen scheint so optimal zu sein und wahrscheinlich, wie @CL sagt, scheint dies eine absichtliche Einschränkung in SQL zu sein, um ein schlechtes Tabellendesign zu vermeiden. Ich denke, dass die performante Lösung, dh die Übereinstimmung jedes Parameters auf der Basis des Kennungsformats vor der Überprüfung und die anschließende Ausführung einer unabhängigen Abfrage für jede Spalte, die beste sein könnte. FTS ist ein guter Ansatz obwohl nach der Validierung jeder obwohl. –

Verwandte Themen