Как использовать регулярное выражение в запросе SQLite?
Я хотел бы использовать регулярное выражение в SQLite, но я не знаю как.
в моей таблице есть столбец со строками вроде этого: "3,12,13,14,19,28,32"
Теперь, если я наберу "where x LIKE '3'", я также получу строки, содержащие значения, такие как 13 или 32,
но я хотел бы получить только строки, которые имеют точно значение 3 в этой строке.
кто-нибудь знает как решить эту проблему?
12 ответов:
как уже указывали другие, REGEXP вызывает пользовательскую функцию, которая должна быть сначала определена и загружена в базу данных. Возможно, некоторые дистрибутивы sqlite или инструменты GUI включают его по умолчанию, но моя установка Ubuntu этого не сделала. Решение было
sudo apt-get install sqlite3-pcreкоторый реализует регулярные выражения Perl в загружаемом модуле в
/usr/lib/sqlite3/pcre.soчтобы иметь возможность использовать его, вы должны загрузить его каждый раз, когда вы открываете базу данных:
.load /usr/lib/sqlite3/pcre.soили вы могли бы поставить это линия в ваш
~/.sqliterc.теперь вы можете запросить вот так:
SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';если вы находитесь на Windows, я думаю, похожие .dll файл должен быть доступен где-то.
SQLite по умолчанию не содержит функции регулярных выражений.
определяет
REGEXPоператор, но это не сработает с сообщением об ошибке, если вы или ваш фреймворк определить пользовательскую функцию под названиемregexp(). Как вы это сделаете будет зависеть от вашей платформы.если у вас
regexp()функция определена, вы можете сопоставить произвольное целое число из списка через запятую, например:... WHERE your_column REGEXP "\b" || your_integer || "\b";но на самом деле, похоже, вы найдете все намного проще, если вы нормализованная структура базы данных заменив эти группы в пределах одного столбца С отдельной строкой для каждого номера в списке через запятую. Тогда вы могли бы использовать не только
=оператор вместо регулярного выражения, но также использовать более мощные реляционные инструменты, такие как соединения, которые SQL предоставляет для вас.
A SQLite UDF в PHP / PDO для
REGEXPключевое слово, которое имитирует поведение в 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модификатор не реализован в MySQL, но я считаю полезным иметь его по умолчанию. Примеры:SELECT * FROM "table" WHERE "name" REGEXP 'sql(ite)*'; SELECT * FROM "table" WHERE regexp('sql(ite)*', "name", '#', 's');если
$dataили$patternNULL, результат NULL-так же, как в MySQL.
Я не очень хорошо отвечаю на вопрос, который был опубликован почти год назад. Но я пишу это для тех, кто думает, что Sqlite сам предоставляет функцию и.
одним из основных требований для вызова функции REGEXP в sqlite является
"вы должны создать свою собственную функцию в приложении, а затем предоставить ссылку обратного вызова для драйвера sqlite".
Для этого вы должны использовать sqlite_create_function (C интерфейс). Вы можете найти деталь от здесь и здесь
UPDATE TableName SET YourField = '' WHERE YourField REGEXP 'YOUR REGEX'и :
SELECT * from TableName WHERE YourField REGEXP 'YOUR REGEX'
вы можете использовать регулярное выражение с и, но это глупый способ сделать точное совпадение.
вы должны просто сказать
WHERE x = '3'.
рассмотрите возможность использования этого
WHERE x REGEXP '(^|,)(3)(,|$)'это будет соответствовать точно 3, Когда x находится в:
- 3
- 3,12,13
- 12,13,3
- 12,3,13
другие примеры:
WHERE x REGEXP '(^|,)(3|13)(,|$)'это будет соответствовать на 3 или 13
мое решение на python с 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()если регулярное выражение совпадает, выход будет 1, в противном случае 0.
Если вы используете php, вы можете добавить любую функцию в свой оператор sql с помощью: SQLite3:: createFunction. В PDO вы можете использовать PDO:: sqliteCreateFunction и реализовать функции preg_match
исчерпывающее предложение or'Ed where может сделать это без конкатенации строк:
WHERE ( x == '3' OR x LIKE '%,3' OR x LIKE '3,%' OR x LIKE '%,3,%');включает в себя четыре случая точное совпадение, конец списка, начало списка и середину списка.
Это более подробно, не требует расширения регулярных выражений.
Comments