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

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文件应该在某个地方可用.

  • 另一个加载选项:我创建了一个视图:SELECT load_extension('/ usr/lib/sqlite3/pcre.so'); 这样,当我使用基于GUI的入口点(如Firefox中的SQLite Manager)时,我有办法加载REGEXP功能. (15认同)
  • 2021 年 6 月 18 日发布的 SQLite 版本 3.36.0 现在在 shell 中内置了“REGEXP”命令。 (7认同)

Dan*_*anS 67

SQLite3支持REGEXP运算符:

WHERE x REGEXP <regex>
Run Code Online (Sandbox Code Playgroud)

http://www.sqlite.org/lang_expr.html#regexp

  • 根据Sqlite文档:REGEXP运算符是regexp()用户函数的特殊语法.默认情况下没有定义regexp()用户函数,因此使用REGEXP运算符通常会导致错误消息.如果在运行时添加名为"regexp"的应用程序定义的SQL函数,则将调用该函数以实现REGEXP运算符.(http://www.sqlite.org/lang_expr.html#regexp) (47认同)
  • @DanS:如何添加`regex()`函数来支持`REGEXP`运算符?默认情况下,尚未添加用户功能. (12认同)
  • @啊!如果 REGEXP 支持不能开箱即用,那么添加它还有什么意义呢? (5认同)
  • 我找到了一个简单的方法:它只是\ bx\b其中x是要在字符串中查找的值:) (3认同)
  • 这是如何被接受的答案?请参阅下面的 mivk 评价较高的答案 /sf/answers/583696081/。 (2认同)

Blo*_*ard 29

没有正则表达式解决它的一种hacky方法是 where ',' || x || ',' like '%,3,%'

  • 你应该使用'','|| x || ""' (3认同)

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中一样.


pea*_*eak 7

使用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)


phy*_*att 6

一个详尽的 or'ed where 子句可以在没有字符串连接的情况下完成:

WHERE ( x == '3' OR
        x LIKE '%,3' OR
        x LIKE '3,%' OR
        x LIKE '%,3,%');
Run Code Online (Sandbox Code Playgroud)

包括四种情况完全匹配、列表结尾、列表开头和中间列表。

这更冗长,不需要正则表达式扩展。


Nav*_*ved 5

我不愿意回答将近一年前发布的问题。但是我是为那些认为Sqlite本身提供功能REGEXP的人写的

在sqlite中调用函数REGEXP的一个基本要求是
“您应该在应用程序中创建自己的函数,然后提供指向sqlite驱动程序的回调链接”
为此,您必须使用sqlite_create_function(C接口)。您可以在这里这里找到详细信息


aGu*_*egu 5

我与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。