Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在SQLite查询中使用正则表达式?_Regex_Sqlite_Query String - Fatal编程技术网

Regex 如何在SQLite查询中使用正则表达式?

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 在没有正则表达式的情况下

我想在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

在没有正则表达式的情况下解决这个问题的一种方法是
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