Chciałbym użyć wyrażenia regularnego w sqlite, ale nie wiem jak.
Moja tabela ma kolumnę z ciągami takimi jak ten: "3,12,13,14,19,28,32" Teraz jeśli wpiszę "gdzie x LIKE '3'" Otrzymuję również wiersze zawierające wartości takie jak 13 lub 32 , ale chciałbym uzyskać tylko te wiersze, które mają dokładnie wartość 3 w tym ciągu.
Czy ktoś wie, jak to rozwiązać?
regex
sqlite
query-string
Cody
źródło
źródło
Odpowiedzi:
SQLite3 obsługuje operator REGEXP:
http://www.sqlite.org/lang_expr.html#regexp
źródło
regex()
funkcję wspierającąREGEXP
operatora? Domyślnie funkcja użytkownika nie została dodana.Jak inni już zauważyli, REGEXP wywołuje funkcję zdefiniowaną przez użytkownika, którą należy najpierw zdefiniować i załadować do bazy danych. Może niektóre dystrybucje sqlite lub narzędzia GUI zawierają to domyślnie, ale moja instalacja Ubuntu nie. Rozwiązaniem było
który implementuje wyrażenia regularne Perla w ładowalnym module w
/usr/lib/sqlite3/pcre.so
Aby móc z niego korzystać, musisz go ładować za każdym razem, gdy otwierasz bazę danych:
Lub możesz umieścić tę linię w swoim
~/.sqliterc
.Teraz możesz zapytać w ten sposób:
Jeśli chcesz wykonywać zapytania bezpośrednio z wiersza poleceń, możesz użyć
-cmd
przełącznika, aby załadować bibliotekę przed SQL:Jeśli korzystasz z systemu Windows, myślę, że podobny plik .dll powinien być gdzieś dostępny.
źródło
Sprytnym sposobem rozwiązania tego problemu bez wyrażenia regularnego jest
where ',' || x || ',' like '%,3,%'
źródło
',' || x || ','
SQLite domyślnie nie zawiera funkcji wyrażeń regularnych.
Definiuje
REGEXP
operator, ale zakończy się niepowodzeniem z komunikatem o błędzie, chyba że Ty lub Twoja struktura zdefiniujesz funkcję użytkownika o nazwieregexp()
. Sposób, w jaki to zrobisz, zależy od Twojej platformy.Jeśli masz
regexp()
zdefiniowaną funkcję, możesz dopasować dowolną liczbę całkowitą z listy oddzielonej przecinkami, na przykład:Ale naprawdę wygląda na to, że byłoby dużo łatwiej, gdybyś znormalizował strukturę bazy danych, zastępując te grupy w jednej kolumnie oddzielnym wierszem dla każdej liczby na liście oddzielonej przecinkami. Wtedy możesz nie tylko użyć
=
operatora zamiast wyrażenia regularnego, ale także użyć potężniejszych narzędzi relacyjnych, takich jak sprzężenia, które zapewnia SQL.źródło
SQLite UDF w PHP / PDO dla
REGEXP
słowa kluczowego, które naśladuje zachowanie w MySQL:u
Modyfikator nie jest zaimplementowany w MySQL, ale uważam, że warto go mieć domyślnie. Przykłady:Jeśli albo
$data
albo$pattern
jest NULL, wynikiem jest NULL - tak jak w MySQL.źródło
moje rozwiązanie w Pythonie z sqlite3:
jeśli wyrażenie regularne jest zgodne, wynikiem będzie 1, w przeciwnym razie 0.
źródło
Nie, dobrze jest odpowiedzieć na pytanie, które pojawiło się prawie rok temu. Ale piszę to dla tych, którzy myślą, że Sqlite sam zapewnia funkcję REGEXP .
Jednym z podstawowych wymagań do wywołania funkcji REGEXP w sqlite jest
„Należy utworzyć własną funkcję w aplikacji, a następnie podać łącze wywołania zwrotnego do sterownika sqlite” .
W tym celu musisz użyć sqlite_create_function (interfejs C). Szczegóły można znaleźć tutaj i tutaj
źródło
I :
źródło
Wyczerpująca klauzula or'ed where może to zrobić bez konkatenacji ciągów:
Obejmuje dokładne dopasowanie czterech przypadków, koniec listy, początek listy i środek listy.
Jest to bardziej szczegółowe, nie wymaga rozszerzenia wyrażenia regularnego.
źródło
W Pythonie, zakładając
con
połączenie z SQLite, możesz zdefiniować wymagany UDF pisząc:Oto bardziej kompletny przykład:
źródło
if x not Null and y not Null and re.search(x,y)
inaczej to wyrzuci.Możesz użyć wyrażenia regularnego z REGEXP , ale jest to głupi sposób na dokładne dopasowanie.
Powinieneś po prostu powiedzieć
WHERE x = '3'
.źródło
Rozważ użycie tego
Dopasuje dokładnie 3, gdy x jest w:
Inne przykłady:
To będzie pasować w 3 lub 13
źródło
W przypadku, gdy ktoś szuka warunku innego niż wyrażenie regularne dla systemu Android Sqlite , takiego jak ten ciąg
[1,2,3,4,5]
, nie zapomnij dodać nawiasu ( [] ) tego samego dla innych znaków specjalnych, takich jak nawias ( {} ) w warunku @phyattźródło
Jeśli używasz php, możesz dodać dowolną funkcję do swojej instrukcji sql, używając: SQLite3 :: createFunction . W PDO możesz użyć PDO :: sqliteCreateFunction i zaimplementować preg_match w swojej instrukcji:
Zobacz, jak zostało to zrobione przez Havalite ( RegExp w SqLite przy użyciu PHP )
źródło
Możesz również rozważyć
Pozwoli to znaleźć numer 3 w dowolnym łańcuchu na dowolnej pozycji
źródło
U Julii model do naśladowania można zilustrować następująco:
źródło
do szyn
źródło