In SQL muss ich (leider) häufig " LIKE
" Bedingungen verwenden, da Datenbanken gegen fast jede Normalisierungsregel verstoßen. Das kann ich momentan nicht ändern. Aber das ist für die Frage irrelevant.
Außerdem verwende ich häufig Bedingungen wie WHERE something in (1,1,2,3,5,8,13,21)
für eine bessere Lesbarkeit und Flexibilität meiner SQL-Anweisungen.
Gibt es eine Möglichkeit, diese beiden Dinge zu kombinieren, ohne komplizierte Unterauswahlen zu schreiben?
Ich möchte etwas so Einfaches wie WHERE something LIKE ('bla%', '%foo%', 'batz%')
stattdessen:
WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'
Ich arbeite hier mit SQl Server und Oracle, bin aber interessiert, ob dies in einem RDBMS überhaupt möglich ist.
like any
/like all
: stackoverflow.com/questions/40475982/sql-like-any-vs-like-all . (Für die Aufzeichnung wurde dies im Oracle Community Ideas Forum community.oracle.com/ideas/11592 angefordert )Antworten:
Es gibt keine Kombination von LIKE & IN in SQL, geschweige denn in TSQL (SQL Server) oder PLSQL (Oracle). Ein Grund dafür ist, dass die Volltextsuche (FTS) die empfohlene Alternative ist.
Sowohl Oracle- als auch SQL Server-FTS-Implementierungen unterstützen das Schlüsselwort CONTAINS, die Syntax unterscheidet sich jedoch geringfügig:
Orakel:
SQL Server:
Die Spalte, die Sie abfragen, muss im Volltext indiziert sein.
Referenz:
quelle
Wenn Sie Ihre Aussage leicht lesbar machen möchten, können Sie REGEXP_LIKE verwenden (verfügbar ab Oracle Version 10).
Eine Beispieltabelle:
Die ursprüngliche Syntax:
Und eine einfach aussehende Abfrage mit REGEXP_LIKE
ABER ...
Ich würde es selbst nicht empfehlen, da die Leistung nicht so gut ist. Ich würde mich an die verschiedenen LIKE-Prädikate halten. Die Beispiele waren also nur zum Spaß.
quelle
du steckst mit dem fest
es sei denn, Sie füllen eine temporäre Tabelle (fügen Sie die Platzhalter in die Daten ein) und treten wie folgt bei:
Probieren Sie es aus (mit SQL Server-Syntax):
AUSGABE:
quelle
LIKE 'bla%'
im Beispielcode des OP tun ? oder kann man nurLIKE '%bla%'
suchen?Bei PostgreSQL gibt es die Form
ANY
oderALL
:oder
Dabei gibt die Unterauswahl genau eine Datenspalte zurück.
quelle
LIKE ANY
undLIKE ALL
sind alle SQL-Dialekte gemeinsam, dh Teil der Kernsprache, oder spezifisch für einen Dialekt?= ANY
oder<> ALL
funktioniert aber nur in SQL, nicht beispielsweise in PLSQL.Eine andere Lösung sollte auf jedem RDBMS funktionieren:
quelle
Ich würde vorschlagen, eine TableValue-Benutzerfunktion zu verwenden, wenn Sie die oben gezeigten Techniken für innere Verknüpfungen oder temporäre Tabellen kapseln möchten. Dies würde es ermöglichen, etwas klarer zu lesen.
Nach Verwendung der Split-Funktion, die unter http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx definiert ist
Wir können Folgendes basierend auf einer von mir erstellten Tabelle mit dem Namen "Fish" schreiben (int id, varchar (50) Name)
Ausgänge
quelle
Ein Ansatz wäre, die Bedingungen in einer temporären Tabelle (oder einer Tabellenvariablen in SQL Server) zu speichern und wie folgt zu verbinden:
quelle
Verwenden Sie stattdessen eine innere Verknüpfung:
quelle
Teradata unterstützt die LIKE ALL / ANY- Syntax:
BEARBEITEN:
jOOQ Version 3.12.0 unterstützt diese Syntax:
Fügen Sie synthetische Operatoren [NOT] LIKE ANY und [NOT] LIKE ALL hinzu
PostgreSQL
LIKE/ILIKE ANY (ARRAY[])
:db <> Geigen-Demo
Snowflake unterstützt auch LIKE ANY / LIKE ALL Matching:
Beispiel:
quelle
Du kannst es sogar versuchen
Funktion
Abfrage
quelle
Ich habe eine einfache Lösung, die zumindest in postgresql funktioniert ,
like any
gefolgt von der Liste der regulären Ausdrücke . Hier ist ein Beispiel für die Identifizierung einiger Antibiotika in einer Liste:quelle
Ich habe mich auch nach so etwas gefragt. Ich habe gerade mit einer Kombination von
SUBSTRING
und getestetIN
und es ist eine effektive Lösung für diese Art von Problem. Versuchen Sie die folgende Abfrage:quelle
In Oracle können Sie eine Sammlung folgendermaßen verwenden:
Hier habe ich einen vordefinierten Sammlungstyp verwendet
ku$_vcnt
, aber Sie können Ihren eigenen wie folgt deklarieren:quelle
Für SQL Server können Sie auf Dynamic SQL zurückgreifen.
In solchen Situationen haben Sie meistens den Parameter der IN-Klausel, der auf einigen Daten aus der Datenbank basiert.
Das folgende Beispiel ist ein wenig "erzwungen", kann jedoch mit verschiedenen realen Fällen in älteren Datenbanken übereinstimmen.
Angenommen, Sie haben eine Tabelle Personen, in der Personennamen in einem einzelnen Feld Personenname als Vorname + '' + Nachname gespeichert sind. Sie müssen alle Personen aus einer Liste von Vornamen auswählen, die im Feld NameToSelect in der Tabelle NamesToSelect gespeichert sind , sowie einige zusätzliche Kriterien (wie nach Geschlecht, Geburtsdatum usw. gefiltert).
Sie können dies wie folgt tun
quelle
Möglicherweise habe ich eine Lösung dafür, obwohl sie meines Wissens nur in SQL Server 2008 funktioniert. Ich habe festgestellt, dass Sie den unter https://stackoverflow.com/a/7285095/894974 beschriebenen Zeilenkonstruktor verwenden können , um eine 'fiktive' Tabelle mit einer like-Klausel zu verbinden. Es klingt komplexer als es ist, schauen Sie:
Dies führt dazu, dass alle Benutzer eine E-Mail-Adresse haben, wie sie in der Liste angegeben ist. Hoffe, es ist für jeden von Nutzen. Das Problem hatte mich eine Weile beschäftigt.
quelle
Ab 2016 enthält SQL Server eine
STRING_SPLIT
Funktion . Ich verwende SQL Server v17.4 und habe Folgendes für mich:quelle
Wenn Sie MySQL verwenden, ist die Volltextsuche die nächstgelegene:
Volltextsuche, MySQL-Dokumentation
quelle
Dies funktioniert für durch Kommas getrennte Werte
Bewertet zu:
Wenn Sie möchten, dass Indizes verwendet werden, müssen Sie das erste
'%'
Zeichen weglassen .quelle
In Oracle RBDMS können Sie dieses Verhalten mit der Funktion REGEXP_LIKE erreichen .
Der folgende Code testet, ob die Zeichenfolge drei im Listenausdruck eins | vorhanden ist zwei | drei | vier | fünf (wobei das Pipe- Symbol " | " ODER-Verknüpfung bedeutet).
Der vorangegangene Ausdruck entspricht:
So wird es gelingen.
Auf der anderen Seite schlägt der folgende Test fehl.
In Oracle sind seit der 10g-Version verschiedene Funktionen für reguläre Ausdrücke (REGEXP_ *) verfügbar. Wenn Sie ein Oracle-Entwickler sind und sich für dieses Thema interessieren, sollte dies ein guter Anfang für die Verwendung regulärer Ausdrücke mit Oracle Database sein .
quelle
Vielleicht denkst du die Kombination so:
Wenn Sie einen Volltextindex für Ihre Zieltabelle definiert haben, können Sie diese Alternative verwenden:
quelle
Keine Antwort wie diese:
Im Orakel kein Problem.
quelle
In Teradata können Sie verwenden
LIKE ANY ('%ABC%','%PQR%','%XYZ%')
. Unten ist ein Beispiel, das für mich die gleichen Ergebnisse erbracht hatquelle
Ich weiß, dass dies sehr spät ist, aber ich hatte eine ähnliche Situation. Ich brauchte einen "Like In" -Operator für eine Reihe von gespeicherten Prozeduren, die viele Parameter akzeptieren und diese Parameter dann zum Aggregieren von Daten aus mehreren RDBMS-Systemen verwenden. Daher würden keine RDBMS-spezifischen Tricks funktionieren, jedoch die gespeicherte Prozedur und alle Funktionen wird auf MS SQL Server ausgeführt, sodass wir T-SQL für die Funktionalität zum Generieren der vollständigen SQL-Anweisungen für jedes RDBMS verwenden können, die Ausgabe muss jedoch ziemlich RDBMS-unabhängig sein.
Dies ist, was ich mir für den Moment ausgedacht habe, um eine durch Trennzeichen getrennte Zeichenfolge (z. B. einen Parameter, der in eine gespeicherte Prozedur eingeht) in einen SQL-Block umzuwandeln. Ich nenne es "Flechte" für "LIKE IN". Kapiert?
Lichen.sql
Die Trennzeichenerkennung ist möglicherweise geplant, aber im Moment wird standardmäßig ein Semikolon verwendet, sodass Sie sie einfach
default
dort einfügen können . Es gibt wahrscheinlich Fehler darin. Der@leadingAnd
Parameter ist nur ein Bitwert, um zu bestimmen, ob ein führendes "UND" vor dem Block stehen soll, damit er gut zu anderen Ergänzungen der WHERE-Klausel passt.Beispielverwendung (mit Trennzeichen in argString)
Gibt einen nvarchar (512) zurück, der Folgendes enthält:
Der Block wird auch übersprungen, wenn die Eingabe kein Trennzeichen enthält:
Beispielverwendung (ohne Trennzeichen in argString)
Gibt einen nvarchar (512) zurück, der Folgendes enthält:
Ich werde weiter daran arbeiten. Wenn ich also etwas übersehen habe (offensichtlich oder auf andere Weise), können Sie dies gerne kommentieren oder erreichen.
quelle
mach das
oder
quelle