Answers:
regex()
功能以支持REGEXP
操作员?默认情况下,未添加用户功能。
正如其他人已经指出的那样,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';
如果要直接从命令行查询,则可以使用该-cmd
开关在SQL之前加载库:
sqlite3 "$filename" -cmd ".load /usr/lib/sqlite3/pcre.so" "SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';"
如果您在Windows上,我猜类似的.dll文件应该在某个位置可用。
默认情况下,SQLite不包含正则表达式功能。
它定义了一个REGEXP
运算符,但是除非您或您的框架定义一个名为的用户函数,否则它将失败并显示一条错误消息regexp()
。您如何执行此操作将取决于您的平台。
如果regexp()
定义了函数,则可以匹配逗号分隔列表中的任意整数,如下所示:
... WHERE your_column REGEXP "\b" || your_integer || "\b";
但是,实际上,如果通过用逗号分隔列表中的每个数字的单独行替换单个列中的那些组来规范化数据库结构,您会发现事情容易得多。然后,您不仅可以使用运算符代替正则表达式,而且可以使用SQL提供给您的更强大的关系工具,例如联接。=
PHP / PDO中的SQLite UDF,用于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中一样。
我与sqlite3在python中的解决方案:
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。
UPDATE TableName
SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'
和:
SELECT * from TableName
WHERE YourField REGEXP 'YOUR REGEX'
使用python(假定con
与SQLite的连接),您可以通过编写以下代码来定义所需的UDF:
con.create_function('regexp', 2, lambda x, y: 1 if re.search(x,y) else 0)
这是一个更完整的示例:
import re
import sqlite3
with sqlite3.connect(":memory:") as con:
con.create_function('regexp', 2, lambda x, y: 1 if re.search(x,y) else 0)
cursor = con.cursor()
# ...
cursor.execute("SELECT * from person WHERE surname REGEXP '^A' ")
if x not Null and y not Null and re.search(x,y)
否则将抛出。
您可以将正则表达式与REGEXP一起使用,但这是进行精确匹配的一种愚蠢的方法。
你应该说WHERE x = '3'
。
如果您使用的是php,则可以使用以下命令将任何函数添加到sql语句中:SQLite3 :: createFunction。在PDO中,您可以使用PDO :: sqliteCreateFunction并在您的语句中实现preg_match函数: