Я бы хотел использовать регулярное выражение в sqlite, но не знаю как.
В моей таблице есть столбец с такими строками: «3,12,13,14,19,28,32». Теперь, если я наберу «где x LIKE '3'», я также получу строки, содержащие такие значения, как 13 или 32 , но я хотел бы получить только те строки, которые имеют в этой строке точное значение 3.
Кто-нибудь знает, как это решить?
regex
sqlite
query-string
Коди
источник
источник
Ответы:
SQLite3 поддерживает оператор REGEXP:
http://www.sqlite.org/lang_expr.html#regexp
источник
regex()
функцию поддержкиREGEXP
оператора? По умолчанию пользовательская функция не добавлена.Как уже указывали другие, REGEXP вызывает определяемую пользователем функцию, которая сначала должна быть определена и загружена в базу данных. Возможно, некоторые дистрибутивы sqlite или инструменты с графическим интерфейсом включают его по умолчанию, но моя установка Ubuntu этого не сделала. Решение было
который реализует регулярные выражения Perl в загружаемом модуле в
/usr/lib/sqlite3/pcre.so
Чтобы иметь возможность использовать его, вы должны загружать его каждый раз, когда открываете базу данных:
Или вы можете поместить эту строку в свой
~/.sqliterc
.Теперь вы можете запросить вот так:
Если вы хотите запросить непосредственно из командной строки, вы можете использовать
-cmd
переключатель для загрузки библиотеки перед вашим SQL:Если вы работаете в Windows, я думаю, что где-то должен быть аналогичный файл .dll.
источник
Хакерский способ решить эту проблему без регулярного выражения -
where ',' || x || ',' like '%,3,%'
источник
',' || x || ','
SQLite по умолчанию не содержит функций регулярных выражений.
Он определяет
REGEXP
оператор, но это приведет к ошибке с сообщением об ошибке, если вы или ваша платформа не определите вызываемую пользовательскую функциюregexp()
. Как вы это сделаете, будет зависеть от вашей платформы.Если у вас есть определенная
regexp()
функция, вы можете сопоставить произвольное целое число из списка, разделенного запятыми, например:Но на самом деле, похоже, вам будет намного проще, если вы нормализуете структуру своей базы данных , заменив эти группы в одном столбце отдельной строкой для каждого числа в списке, разделенном запятыми. Тогда вы можете не только использовать
=
оператор вместо регулярного выражения, но и использовать более мощные реляционные инструменты, такие как объединения, которые предоставляет вам SQL.источник
SQLite UDF в PHP / PDO для
REGEXP
ключевого слова, которое имитирует поведение в MySQL:u
Модификатор не реализован в MySQL, но я считаю , что полезно иметь его по умолчанию. Примеры:Если либо
$data
или$pattern
равно NULL, результат будет NULL - как и в MySQL.источник
мое решение в python с sqlite3:
если регулярное выражение совпадает, вывод будет 1, иначе 0.
источник
Я не хочу отвечать на вопрос, который был задан почти год назад. Но я пишу это для тех, кто думает, что сам Sqlite предоставляет функцию REGEXP .
Одно из основных требований для вызова функции REGEXP в sqlite:
«Вы должны создать свою собственную функцию в приложении, а затем предоставить обратную ссылку для драйвера sqlite» .
Для этого вам нужно использовать sqlite_create_function (интерфейс C). Вы можете найти подробности здесь и здесь
источник
И :
источник
Исчерпывающее предложение or'ed where может делать это без конкатенации строк:
Включает четыре случая: точное совпадение, конец списка, начало списка и середину списка.
Это более подробный вариант, не требует расширения регулярного выражения.
источник
С python, предполагая, что
con
это соединение с SQLite, вы можете определить необходимый UDF, написав:Вот более полный пример:
источник
if x not Null and y not Null and re.search(x,y)
иначе выкинут.Вы можете использовать регулярное выражение с REGEXP , но это глупый способ получить точное соответствие.
Вы должны просто сказать
WHERE x = '3'
.источник
Рассмотрите возможность использования этого
Это будет соответствовать ровно 3, когда x находится в:
Другие примеры:
Это будет соответствовать 3 или 13
источник
В случае, если кто-то ищет условие без регулярного выражения для Android Sqlite , например, эту строку
[1,2,3,4,5]
, не забудьте добавить скобку ( [] ) так же, как и другие специальные символы, такие как скобка ( {} ), в условии @phyattисточник
Если вы используете php, вы можете добавить любую функцию в свой оператор sql, используя: SQLite3 :: createFunction . В PDO вы можете использовать PDO :: sqliteCreateFunction и реализовать функцию preg_match в своем операторе:
Посмотрите, как это делается в Havalite ( RegExp в SqLite с использованием Php )
источник
Вы также можете рассмотреть
Это позволит найти цифру 3 в любой строке в любой позиции
источник
В Юлии модель, которой нужно следовать, можно проиллюстрировать следующим образом:
источник
для рельсов
источник