Ich möchte einen regulären Ausdruck in SQLite verwenden, weiß aber nicht wie.
Meine Tabelle hat eine Spalte mit folgenden Zeichenfolgen: "3,12,13,14,19,28,32" Wenn ich nun "where x LIKE '3'" eingebe, erhalte ich auch die Zeilen, die Werte wie 13 oder 32 enthalten , aber ich möchte nur die Zeilen erhalten, die genau den Wert 3 in dieser Zeichenfolge haben.
Weiß jemand, wie man das löst?
regex
sqlite
query-string
Cody
quelle
quelle
Antworten:
SQLite3 unterstützt den REGEXP-Operator:
http://www.sqlite.org/lang_expr.html#regexp
quelle
regex()
Funktion hinzu, um denREGEXP
Operator zu unterstützen ? Standardmäßig wurde keine Benutzerfunktion hinzugefügt.Wie bereits erwähnt, ruft REGEXP eine benutzerdefinierte Funktion auf, die zuerst definiert und in die Datenbank geladen werden muss. Möglicherweise enthalten einige SQLite-Distributionen oder GUI-Tools dies standardmäßig, meine Ubuntu-Installation jedoch nicht. Die Lösung war
Hiermit werden reguläre Perl-Ausdrücke in einem ladbaren Modul implementiert
/usr/lib/sqlite3/pcre.so
Um es verwenden zu können, müssen Sie es jedes Mal laden, wenn Sie die Datenbank öffnen:
Oder Sie könnten diese Zeile in Ihre setzen
~/.sqliterc
.Jetzt können Sie wie folgt abfragen:
Wenn Sie direkt über die Befehlszeile abfragen möchten, können Sie
-cmd
die Bibliothek mit dem Schalter vor Ihrem SQL laden:Wenn Sie unter Windows arbeiten, sollte eine ähnliche DLL-Datei irgendwo verfügbar sein.
quelle
Ein hackiger Weg, um es ohne Regex zu lösen, ist
where ',' || x || ',' like '%,3,%'
quelle
',' || x || ','
SQLite enthält standardmäßig keine Funktionen für reguläre Ausdrücke.
Es definiert einen
REGEXP
Operator, dies schlägt jedoch mit einer Fehlermeldung fehl, es sei denn, Sie oder Ihr Framework definieren eine aufgerufene Benutzerfunktionregexp()
. Wie Sie dies tun, hängt von Ihrer Plattform ab.Wenn Sie eine
regexp()
Funktion definiert haben, können Sie eine beliebige Ganzzahl aus einer durch Kommas getrennten Liste wie folgt abgleichen:Aber es sieht wirklich so aus, als würden Sie die Dinge viel einfacher finden, wenn Sie Ihre Datenbankstruktur normalisieren würden, indem Sie diese Gruppen in einer einzelnen Spalte durch eine separate Zeile für jede Zahl in der durch Kommas getrennten Liste ersetzen . Dann könnten Sie nicht nur den
=
Operator anstelle eines regulären Ausdrucks verwenden, sondern auch leistungsfähigere relationale Tools wie Joins, die SQL für Sie bereitstellt.quelle
Eine SQLite-UDF in PHP / PDO für das
REGEXP
Schlüsselwort, das das Verhalten in MySQL nachahmt:Der
u
Modifikator ist nicht in MySQL implementiert, aber ich finde es nützlich, ihn standardmäßig zu haben. Beispiele:Wenn entweder
$data
oder$pattern
NULL ist, ist das Ergebnis NULL - genau wie in MySQL.quelle
meine lösung in python mit sqlite3:
Wenn Regex übereinstimmt, wäre die Ausgabe 1, andernfalls 0.
quelle
Ich finde es nicht gut, eine Frage zu beantworten, die vor fast einem Jahr gestellt wurde. Aber ich schreibe dies für diejenigen, die denken, dass Sqlite selbst die Funktion REGEXP bereitstellt .
Eine Grundvoraussetzung zum Aufrufen der Funktion REGEXP in SQLite ist
"Sie sollten Ihre eigene Funktion in der Anwendung erstellen und dann den Rückruflink zum SQLite-Treiber bereitstellen" .
Dafür müssen Sie sqlite_create_function (C-Schnittstelle) verwenden. Details finden Sie hier und hier
quelle
Und :
quelle
Eine erschöpfende or'ed where-Klausel kann dies ohne Verkettung von Zeichenfolgen tun:
Beinhaltet die exakte Übereinstimmung der vier Fälle, das Ende der Liste, den Anfang der Liste und die mittlere Liste.
Dies ist ausführlicher und erfordert keine Regex-Erweiterung.
quelle
Unter der Annahme, dass
con
es sich bei Python um eine Verbindung zu SQLite handelt, können Sie die erforderliche UDF definieren , indem Sie Folgendes schreiben:Hier ist ein vollständigeres Beispiel:
quelle
if x not Null and y not Null and re.search(x,y)
sonst wird es werfen.Sie könnten mit REGEXP einen regulären Ausdruck verwenden , aber das ist eine dumme Methode, um eine genaue Übereinstimmung zu erzielen .
Du solltest nur sagen
WHERE x = '3'
.quelle
Erwägen Sie, dies zu verwenden
Dies entspricht genau 3, wenn x in ist:
Andere Beispiele:
Dies wird am 3 oder 13 übereinstimmen
quelle
Wenn jemand wie diese Zeichenfolge nach einer Nicht-Regex-Bedingung für Android Sqlite sucht ,
[1,2,3,4,5]
vergessen Sie nicht, die gleiche Klammer ( [] ) für andere Sonderzeichen wie Klammern ( {} ) in @phyatt-Bedingung hinzuzufügenquelle
Wenn Sie PHP verwenden, können Sie Ihrer SQL-Anweisung eine beliebige Funktion hinzufügen, indem Sie Folgendes verwenden: SQLite3 :: createFunction . In PDO können Sie PDO :: sqliteCreateFunction verwenden und die Funktion preg_match in Ihrer Anweisung implementieren :
Sehen Sie, wie es von Havalite gemacht wird ( RegExp in SqLite mit Php )
quelle
Sie können auch berücksichtigen
Dies ermöglicht es, Nummer 3 in einer beliebigen Zeichenfolge an einer beliebigen Position zu finden
quelle
In Julia kann das folgende Modell wie folgt dargestellt werden:
quelle
für Schienen
quelle