Pytanie Jak używać wyrażenia regularnego w kwerendzie SQLite?


Chciałbym użyć wyrażenia regularnego w sqlite, ale nie wiem jak.

Mój stół ma kolumnę z takimi ciągami: "3,12,13,14,19,28,32" Teraz gdy piszę "gdzie x LIKE" 3 "" Otrzymuję również wiersze, które zawierają wartości takie jak 13 lub 32, ale chciałbym uzyskać tylko wiersze, które mają dokładnie wartość 3 w tym ciągu.

Czy ktoś wie, jak rozwiązać ten problem?


76
2018-02-21 21:43


pochodzenie


Ta odpowiedź jest najlepsza dla dodawania funkcji REGEXP do sqlite wc # stackoverflow.com/a/26155359/5734452 - hubaishan


Odpowiedzi:


SQLite3 obsługuje operator REGEXP:

WHERE x REGEXP <regex>

54
2018-02-21 21:51



Znalazłem prosty sposób: To po prostu \ bx \ b gdzie x to wartość, której należy szukać w ciągu znaków :) - cody
@DanS: Jak dodać regex() funkcja wspierająca REGEXP operator? Domyślnie funkcja użytkownika nie została dodana. - SK9
Według dokumentów Sqlite: Operator REGEXP jest specjalną składnią dla funkcji użytkownika regexp (). Żadna funkcja użytkownika regexp () nie jest zdefiniowana domyślnie, więc użycie operatora REGEXP spowoduje zwykle pojawienie się komunikatu o błędzie. Jeśli w czasie wykonywania zostanie dodana funkcja SQL zdefiniowana przez aplikację o nazwie "regexp", funkcja ta zostanie wywołana w celu implementacji operatora REGEXP. (sqlite.org/lang_expr.html#regexp) - radicand
Dla tych z nas, którzy dostają błąd podczas wypróbowywania tego sprawdź odpowiedź poniżej stackoverflow.com/a/18484596/1585572 Umieściłem kod w pliku i zaimportowałem go do zdefiniowanych przez użytkownika funkcji w moim menedżerze sqlite Firefox. Musisz wywołać go nieco inaczej, na przykład: SELECT * FROM table WHERE regexp column ("myregexp") - Tristan


Jak już inni zwrócili uwagę, REGEXP wywołuje funkcję zdefiniowaną przez użytkownika, która musi najpierw zostać zdefiniowana i załadowana do bazy danych. Może niektóre dystrybucje sqlite lub narzędzia GUI domyślnie je uwzględniają, ale moja instalacja Ubuntu nie działa. Rozwiązaniem było

sudo apt-get install sqlite3-pcre

która implementuje wyrażeń regularnych Perla w ładowalnym module w /usr/lib/sqlite3/pcre.so

Aby móc z niego korzystać, musisz załadować go przy każdym otwarciu bazy danych:

.load /usr/lib/sqlite3/pcre.so

Lub możesz umieścić tę linię w swoim ~/.sqliterc.

Teraz możesz zapytać w ten sposób:

SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';

Jeśli korzystasz z systemu Windows, prawdopodobnie podobny plik .dll powinien być dostępny gdzieś.


87
2017-12-01 08:41



Inna opcja obciążenia: Stworzyłem widok z tym: SELECT load_extension ('/ usr / lib / sqlite3 / pcre.so'); W ten sposób, gdy używam punktu wejścia opartego na GUI do DB (jak SQLite Manager w Firefox), mam sposób na załadowanie możliwości REGEXP. - Paulb


Prostym sposobem na rozwiązanie tego problemu bez regex jest where ',' || x || ',' like '%,3,%'


27
2018-02-21 21:56



Tak, myślałem o tym w ten sposób, ale za każdym razem nie ma przewodnictwa ani śledzenia "." Dzięki i tak :-) - cody
@cody, dlatego dodajemy przecinki do x przed testowaniem - powinno działać. - Blorgbeard
Ach ... Rozumiem ... w tym przypadku może być nawet lepiej niż regex! Wspaniały! Dzięki - cody
Nie natknąłem się na problem tutaj - Zastanawiam się, czy to działa tak jak x jest nazwą kolumny ... - cody
Powinieneś użyć ',' || x || ',' - baruch


SQLite nie zawiera domyślnie funkcji wyrażeń regularnych.

Definiuje a REGEXP operator, ale to nie powiedzie się z komunikatem o błędzie, chyba że Ty lub Twój framework zdefiniuj funkcję użytkownika nazywa regexp(). Sposób, w jaki to zrobisz, będzie zależeć od twojej platformy.

Jeśli masz regexp() zdefiniowana funkcja, możesz dopasować dowolną liczbę całkowitą z listy oddzielonej przecinkami, jak na przykład:

... WHERE your_column REGEXP "\b" || your_integer || "\b";

Ale tak naprawdę wygląda na to, że łatwiej by było ci znaleźć rzeczy znormalizowane struktury bazy danych zastępując je grupy w jednej kolumnie z oddzielnym wierszem dla każdego numeru na liście rozdzielanej przecinkami. Wtedy możesz nie tylko użyć = zamiast zwykłego wyrażenia, ale także użyj bardziej wydajnych narzędzi relacyjnych, takich jak połączenia, które zapewnia ci SQL.


17
2017-11-23 15:24





UDF SQLite w PHP / PDO dla REGEXP słowo kluczowe, które naśladuje zachowanie w MySQL:

$pdo->sqliteCreateFunction('regexp',
    function ($pattern, $data, $delimiter = '~', $modifiers = 'isuS')
    {
        if (isset($pattern, $data) === true)
        {
            return (preg_match(sprintf('%1$s%2$s%1$s%3$s', $delimiter, $pattern, $modifiers), $data) > 0);
        }

        return null;
    }
);

The u modyfikator nie jest zaimplementowany w MySQL, ale domyślnie jest to przydatne. Przykłady:

SELECT * FROM "table" WHERE "name" REGEXP 'sql(ite)*';
SELECT * FROM "table" WHERE regexp('sql(ite)*', "name", '#', 's');

Jeśli którykolwiek $data lub $pattern ma wartość NULL, wynikiem jest NULL - podobnie jak w MySQL.


10
2017-08-28 09:50





Nie jest dobrze odpowiedzieć na pytanie, które zostało opublikowane prawie rok temu. Ale piszę to dla tych, którzy myślą, że sam Sql zapewnia taką funkcję REGEXP.

Jednym z podstawowych wymagań wywołania funkcji REGEXP w sqlite jest
"Powinieneś stworzyć swoją własną funkcję w aplikacji, a następnie podać link do oddzwaniania do sterownika sqlite".
Do tego musisz użyć funkcji sqlite_create_function (interfejs C). Możesz znaleźć szczegóły z tutaj i tutaj


3
2017-11-09 05:18





UPDATE TableName
 SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'

I :

SELECT * from TableName
 WHERE YourField REGEXP 'YOUR REGEX'

3
2018-06-30 14:19





Możesz użyć wyrażenia regularnego z REGEXP, ale to głupi sposób na dokładne dopasowanie.

Powinieneś po prostu powiedzieć WHERE x = '3'.


2
2018-02-21 21:47



Powinienem był to wyjaśnić lepiej (przepraszam za mój słaby angielski), miałem na myśli tylko pewną dokładną wartość, a nie dokładny ciąg. Dzięki i tak! - cody


Rozważ użycie tego

WHERE x REGEXP '(^|,)(3)(,|$)'

Dopasuje dokładnie 3, gdy x jest w:

  • 3
  • 3,12,13
  • 12,13,3
  • 12,3,13

Inne przykłady:

WHERE x REGEXP '(^|,)(3|13)(,|$)'

To będzie pasować na 3 lub 13


2
2017-10-27 11:43





moje rozwiązanie w pythonie z sqlite3:

   import sqlite3
   import re

   def match(expr, item):
        return re.match(expr, item) is not None

   conn = sqlite3.connect(':memory:')
   conn.create_function("MATCHES", 2, match)
   cursor = conn.cursor()
   cursor.execute("SELECT MATCHES('^b', 'busy');")
   print cursor.fetchone()[0]

   cursor.close()
   conn.close()

jeśli wyrażenie regularne się zgadza, wynik będzie wynosił 1, w przeciwnym razie 0.


2
2018-06-05 07:04





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 wdrożyć preg_match funkcja w twoim oświadczeniu:

Zobacz jak to się robi przez Havalite (RegExp w SqLite przy użyciu Php)


0
2017-10-21 18:04



W funkcji REGEXP MySQL nie trzeba określać ograniczników ani modyfikatorów we wzorcu. - Alix Axel