Как использовать регулярные выражения в запросе SQLite? - PullRequest
91 голосов
/ 22 февраля 2011

Я бы хотел использовать регулярное выражение в sqlite, но я не знаю, как.

В моей таблице есть столбец с такими строками: "3,12,13,14,19,28,32" Теперь, если я наберу "где x LIKE '3'", я также получу строки, которые содержат значения, такие как 13 или 32, но я хотел бы получить только те строки, которые имеют значение 3 в этой строке.

Кто-нибудь знает, как это решить?

Ответы [ 13 ]

97 голосов
/ 01 декабря 2011

Как уже указывали другие, REGEXP вызывает пользовательскую функцию, которая должна быть сначала определена и загружена в базу данных. Может быть, некоторые дистрибутивы sqlite или инструменты с графическим интерфейсом включают его по умолчанию, но моя установка 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';

Если вы хотите выполнить запрос непосредственно из командной строки, вы можете использовать переключатель -cmd для загрузки библиотеки перед вашим SQL:

sqlite3 "$filename" -cmd ".load /usr/lib/sqlite3/pcre.so" "SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';"

Если вы работаете в Windows, я думаю, что аналогичный файл .dll должен быть где-то доступен.

68 голосов
/ 22 февраля 2011

SQLite3 поддерживает оператор REGEXP:

WHERE x REGEXP <regex>

http://www.sqlite.org/lang_expr.html#regexp

29 голосов
/ 22 февраля 2011

Хакерский способ решить это без регулярных выражений - where ',' || x || ',' like '%,3,%'

20 голосов
/ 23 ноября 2011

SQLite по умолчанию не содержит функциональности регулярных выражений.

Он определяет оператор REGEXP, но это приведет к ошибке с сообщением об ошибке, если вы или ваша структура не определите пользовательскую функцию называется regexp().То, как вы это сделаете, будет зависеть от вашей платформы.

Если у вас определена функция regexp(), вы можете сопоставить произвольное целое число из списка через запятую, например:

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

Но на самом деле, похоже, вам было бы намного проще, если бы вы нормализовали структуру базы данных , заменив эти группы в одном столбце отдельной строкой для каждого числа в запятойразделенный список.Тогда вы могли бы не только использовать оператор = вместо регулярного выражения, но и использовать более мощные реляционные инструменты, такие как объединения, которые SQL предоставляет для вас.

14 голосов
/ 28 августа 2013

UDF SQLite в 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;
    }
);

Модификатор u не реализован в MySQL, но я считаю полезным иметь его по умолчанию. Примеры:

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

Если $data или $pattern равен NULL, результат равен NULL - как в MySQL.

5 голосов
/ 09 ноября 2011

Не знаю, хорошо ли отвечать на вопрос, который был опубликован почти год назад. Но я пишу это для тех, кто считает, что сам Sqlite предоставляет функцию REGEXP .

Одним из основных требований для вызова функции REGEXP в sqlite является
«Вы должны создать свою собственную функцию в приложении и затем предоставить ссылку обратного вызова для драйвера sqlite» .
Для этого вы должны использовать sqlite_create_function (интерфейс C). Вы можете найти детали из здесь и здесь

4 голосов
/ 30 июня 2015
UPDATE TableName
 SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'

А:

SELECT * from TableName
 WHERE YourField REGEXP 'YOUR REGEX'
3 голосов
/ 05 июня 2014

мое решение в 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.

2 голосов
/ 27 октября 2011

Рассмотрите возможность использования этого

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

Это будет точно соответствовать 3, когда х находится в:

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

Другие примеры:

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

Это будет соответствовать 3 или 13

2 голосов
/ 22 февраля 2011

Вы можете использовать регулярное выражение с REGEXP , но это глупый способ сделать точное совпадение.

Вы должны просто сказать WHERE x = '3'.

...