cod*_*ody 94 regex sqlite query-string
我想在sqlite中使用正则表达式,但我不知道如何.
我的表有一个字符串,如下所示:"3,12,13,14,19,28,32"现在如果我输入"where x LIKE'3'"我也得到包含13或32之类值的行,但我想只获得该字符串中具有正好值3的行.
有谁知道如何解决这个问题?
miv*_*ivk 103
正如其他人已经指出的那样,REGEXP调用用户定义的函数,该函数必须首先被定义并加载到数据库中.也许一些sqlite发行版或GUI工具默认包含它,但我的Ubuntu安装没有.解决方案是
sudo apt-get install sqlite3-pcre
Run Code Online (Sandbox Code Playgroud)
它在可加载模块中实现Perl正则表达式 /usr/lib/sqlite3/pcre.so
为了能够使用它,您必须在每次打开数据库时加载它:
.load /usr/lib/sqlite3/pcre.so
Run Code Online (Sandbox Code Playgroud)
或者你可以把那条线放进你的~/.sqliterc.
现在您可以像这样查询:
SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';
Run Code Online (Sandbox Code Playgroud)
如果要直接从命令行查询,可以使用-cmd开关在SQL之前加载库:
sqlite3 "$filename" -cmd ".load /usr/lib/sqlite3/pcre.so" "SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';"
Run Code Online (Sandbox Code Playgroud)
如果你在Windows上,我猜一个类似的.dll文件应该在某个地方可用.
Dan*_*anS 67
SQLite3支持REGEXP运算符:
WHERE x REGEXP <regex>
Run Code Online (Sandbox Code Playgroud)
http://www.sqlite.org/lang_expr.html#regexp
Ian*_*non 21
默认情况下,SQLite不包含正则表达式功能.
它定义了一个REGEXP运算符,但除非您或您的框架定义了一个名为的用户函数,否则这将失败并显示错误消息regexp().如何执行此操作取决于您的平台.
如果regexp()定义了函数,则可以匹配逗号分隔列表中的任意整数,如下所示:
... WHERE your_column REGEXP "\b" || your_integer || "\b";
Run Code Online (Sandbox Code Playgroud)
但实际上,如果您通过将单个列中的那些组替换为逗号分隔列表中的每个数字的单独行来标准化数据库结构,那么看起来您会发现事情变得更加容易.然后,您不仅可以使用运算符而不是正则表达式,还可以使用更强大的关系工具,例如SQL为您提供的连接.=
Ali*_*xel 14
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;
}
);
Run Code Online (Sandbox Code Playgroud)
该u修饰符不能在MySQL中实现,但是我发现它有用在默认情况下有它.例子:
SELECT * FROM "table" WHERE "name" REGEXP 'sql(ite)*';
SELECT * FROM "table" WHERE regexp('sql(ite)*', "name", '#', 's');
Run Code Online (Sandbox Code Playgroud)
如果其中一个$data或$pattern为NULL,则结果为NULL - 就像在MySQL中一样.
使用python,假设con是连接到SQLite,你可以通过编写来定义所需的UDF:
con.create_function('regexp', 2, lambda x, y: 1 if re.search(x,y) else 0)
Run Code Online (Sandbox Code Playgroud)
这是一个更完整的例子:
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' ")
Run Code Online (Sandbox Code Playgroud)
一个详尽的 or'ed where 子句可以在没有字符串连接的情况下完成:
WHERE ( x == '3' OR
x LIKE '%,3' OR
x LIKE '3,%' OR
x LIKE '%,3,%');
Run Code Online (Sandbox Code Playgroud)
包括四种情况完全匹配、列表结尾、列表开头和中间列表。
这更冗长,不需要正则表达式扩展。
我与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()
Run Code Online (Sandbox Code Playgroud)
如果正则表达式匹配,则输出为1,否则为0。