如何在SQLite查询中使用正则表达式?
我想在sqlite中使用正则表达式,但我不知道如何。
我的表有一个字符串这样的列:“3,12,13,14,19,28,32”现在,如果我键入“其中x LIKE'3”“我也得到包含像13或32 ,但我想只得到具有该字符串中的值3的行。
有谁知道如何解决这个问题?
SQLite3支持REGEXP运算符:
WHERE x REGEXP <regex>
正如其他人已经指出,REGEXP调用一个用户定义的函数,必须首先定义并加载到数据库中。 也许有些sqlite发行版或GUI工具默认包含它,但是我的Ubuntu安装没有。 解决方案是
sudo apt-get install sqlite3-pcre
它在/usr/lib/sqlite3/pcre.so
的可加载模块中实现Perl正则表达式
为了能够使用它,每次打开数据库时都必须加载它:
.load /usr/lib/sqlite3/pcre.so
或者你可以把这行放到你的~/.sqliterc
。
现在你可以这样查询:
SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';
如果你在Windows上,我猜一个类似的.dll文件应该可用的地方。
解决它没有正则表达式的一个奇怪的方法是where ',' || x || ',' like '%,3,%'
where ',' || x || ',' like '%,3,%'
SQLite默认不包含正则表达式功能。
它定义了一个REGEXP
操作符,但是除非你或者你的框架定义了一个名为regexp()
的用户函数,否则这将会失败并显示错误信息。 你如何做到这一点将取决于你的平台。
如果你定义了一个regexp()
函数,你可以像下面这样匹配一个逗号分隔列表中的任意整数:
... WHERE your_column REGEXP "\b" || your_integer || "\b";
但是,实际上,如果通过用逗号分隔列表中的每个数字的单独一行替换单个列中的那些组 ,则看起来会更容易一些。 那么你不仅可以使用=
运算符而不是正则表达式,还可以使用更强大的关系工具,如SQL为您提供的连接。
PHP / PDO中用于模仿MySQL行为的REGEXP
关键字的SQLite UDF:
$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中一样。
我不是很好回答一年前发布的一个问题。 但是我为那些认为Sqlite本身提供了REGEXP功能的人写这个。
在sqlite中调用函数REGEXP的一个基本要求是
“你应该在应用程序中创建你自己的函数,然后提供回调链接到sqlite驱动程序” 。
为此你必须使用sqlite_create_function(C接口)。 你可以从这里和这里找到细节
UPDATE TableName SET YourField = '' WHERE YourField REGEXP 'YOUR REGEX'
和:
SELECT * from TableName WHERE YourField REGEXP 'YOUR REGEX'
你可以使用正则表达式与REGEXP ,但这是一个愚蠢的方式来做一个完全匹配。
你应该说WHERE x = '3'
。
考虑使用这个
WHERE x REGEXP '(^|,)(3)(,|$)'
当x在时,这将匹配3。
- 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函数:
看看它是如何完成哈瓦利特( RegExp在 SqLite 使用PHP )
一个穷举or'ed where子句可以做到没有字符串连接:
WHERE ( x == '3' OR x LIKE '%,3' OR x LIKE '3,%' OR x LIKE '%,3,%');
包括完全匹配,列表结束,列表开始和中间列表四种情况。
这是更详细的,不需要正则表达式扩展。