Regex 如何在SQLite查询中使用正则表达式?
我想在sqlite中使用正则表达式,但我不知道如何使用 我的表中有一列字符串如下:“3,12,13,14,19,28,32” 现在如果我输入“where x LIKE'3'”,我也会得到包含13或32等值的行, 但我只想得到字符串中值为3的行Regex 如何在SQLite查询中使用正则表达式?,regex,sqlite,query-string,Regex,Sqlite,Query String,我想在sqlite中使用正则表达式,但我不知道如何使用 我的表中有一列字符串如下:“3,12,13,14,19,28,32” 现在如果我输入“where x LIKE'3'”,我也会得到包含13或32等值的行, 但我只想得到字符串中值为3的行 有人知道如何解决这个问题吗?您可以使用正则表达式,但这是一种进行精确匹配的愚蠢方法 您应该只说其中x='3'SQLite3支持REGEXP操作符: WHERE x REGEXP <regex> 其中x REGEXP 在没有正则表达式的情况下
有人知道如何解决这个问题吗?您可以使用正则表达式,但这是一种进行精确匹配的愚蠢方法
您应该只说
其中x='3'
SQLite3支持REGEXP操作符:
WHERE x REGEXP <regex>
其中x REGEXP
在没有正则表达式的情况下解决这个问题的一种方法是
where'、'| | x | | |'、'像'%,3,%'
考虑使用这个方法
WHERE x REGEXP '(^|,)(3)(,|$)'
当x处于以下位置时,这将正好匹配3:
- 三,
- 3,12,13
- 12,13,3
- 12,3,13
WHERE x REGEXP '(^|,)(3|13)(,|$)'
这将在3日或13日匹配,我不认为回答一个差不多一年前发布的问题是好的。但我写这篇文章是为了那些认为Sqlite本身提供函数REGEXP的人 在sqlite中调用函数REGEXP的一个基本要求是
“您应该在应用程序中创建自己的函数,然后提供指向sqlite驱动程序的回调链接”
为此,您必须使用sqlite_create_函数(C接口)。您可以从中找到详细信息,并且默认情况下SQLite不包含正则表达式功能 它定义了一个
REGEXP
操作符,但除非您或您的框架调用REGEXP()
,否则操作将失败并显示错误消息。如何做到这一点将取决于您的平台
如果定义了regexp()
函数,则可以从逗号分隔的列表中匹配任意整数,如下所示:
... WHERE your_column REGEXP "\b" || your_integer || "\b";
但实际上,如果你用逗号分隔的列表中的每一个数字的单独行来替换这些数字,你会发现事情会变得简单得多。然后,您不仅可以使用
=
操作符而不是正则表达式,还可以使用SQL为您提供的更强大的关系工具(如联接)。正如其他人已经指出的,REGEXP调用用户定义的函数,该函数必须首先定义并加载到数据库中。也许某些sqlite发行版或GUI工具默认包含它,但我的Ubuntu安装没有。解决办法是
sudo apt-get install sqlite3-pcre
它在/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文件应该在某处可用。如果您使用的是php,您可以使用以下命令将任何函数添加到sql语句中:。 在PDO中,您可以在语句中使用和实现函数:
查看Havalite()如何在PHP/PDO中使用SQLite UDF来实现它,以获得模仿MySQL中行为的
REGEXP
关键字:
$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
为空,则结果为空-就像在MySQL中一样。我的Python解决方案:
导入sqlite3
进口稀土
def匹配(expr,项目):
return re.match(expr,item)不是None
conn=sqlite3.connect(“:内存:”)
conn.create_函数(“匹配”,2,匹配)
游标=连接游标()
cursor.execute(“选择匹配项(“^b”,“忙”);”)
打印游标。fetchone()[0]
cursor.close()
康涅狄格州关闭
如果正则表达式匹配,则输出为1,否则为0
UPDATE TableName
SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'
以及:
一个穷举的or'ed where子句可以在没有字符串连接的情况下完成此操作:
WHERE ( x == '3' OR
x LIKE '%,3' OR
x LIKE '3,%' OR
x LIKE '%,3,%');
包括四种情况:完全匹配、列表末尾、列表开头和中间列表
这是比较冗长的,不需要正则表达式扩展。
你也可以考虑
WHERE x REGEXP '(^|\D{1})3(\D{1}|$)'
这将允许在任何位置的任何字符串中查找数字3,以防有人在@phyatt条件中为Android Sqlite查找非正则表达式条件,例如此字符串
[1,2,3,4,5]
,然后不要忘记为其他特殊字符(如括号({})添加相同的括号([)
WHERE ( x == '[3]' OR
x LIKE '%,3]' OR
x LIKE '[3,%' OR
x LIKE '%,3,%');
对于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' ")
在Julia中,要遵循的模型可以如下所示:
using SQLite
using DataFrames
db = SQLite.DB("<name>.db")
register(db, SQLite.regexp, nargs=2, name="regexp")
SQLite.Query(db, "SELECT * FROM test WHERE name REGEXP '^h';") |> DataFrame
使用SQLite
使用数据帧
db=SQLite.db(“.db”)
寄存器(db,SQLite.regexp,nargs=2,name=“regexp”)
SQLite.Query(db,“从测试中选择*,其中名称为REGEXP“^h”;”)|>DataFrame
用于导轨
db=ActiveRecord::Base.connection.raw\u连接
db.create_函数('regexp',2)do|func,模式,表达式|
func.result=expression.to_s.match(Regexp.new(pattern.to_s,Regexp::IGNORECASE))?1 : 0
结束
是的,我想过这样做,但不是每次都有“引导”或“跟随”。无论如何,谢谢:-)我没有在这里偶然发现这个问题-我想知道这是否有效,因为x是列名…你应该使用,“|x | |”,“
我应该更好地解释它(抱歉我的英语不好),我只是指某个确切的值,而不是确切的字符串。无论如何谢谢你!我找到了一个简单的方法:它只是\bx\b其中x是字符串中要查找的值:)@DanS:如何添加regex()
函数来支持REGEXP
操作符?默认情况下未添加用户函数。根据Sqlite文档:REGEXP运算符是REGEXP()用户函数的特殊语法。默认情况下未定义任何regexp()用户函数,因此使用regexp运算符w
using SQLite
using DataFrames
db = SQLite.DB("<name>.db")
register(db, SQLite.regexp, nargs=2, name="regexp")
SQLite.Query(db, "SELECT * FROM test WHERE name REGEXP '^h';") |> DataFrame