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

144

我想在sqlite中使用正则表达式,但是不知道怎么做。

我的表格有一个列,其中包含像这样的字符串:“3,12,13,14,19,28,32”。 现在,如果我输入“where x LIKE '3'”,我也会得到包含值13或32之类的行, 但是我只想得到具有该字符串中确切值3的行。

有人知道如何解决这个问题吗?


2
这个答案是在C#中为SQLite添加REGEXP函数的最佳方法 https://dev59.com/d2Af5IYBdhLWcg3w0Vi7#26155359 - hubaishan
21个回答

3
最初的回答
你也可以考虑以下内容:
WHERE x REGEXP '(^|\D{1})3(\D{1}|$)'

这将允许在任何位置的任何字符串中查找数字3。最初的回答。

3
请考虑使用这个。
WHERE x REGEXP '(^|,)(3)(,|$)'

当x在以下情况下,这将精确匹配3:

  • 3
  • 3,12,13
  • 12,13,3
  • 12,3,13

其他示例:

WHERE x REGEXP '(^|,)(3|13)(,|$)'

这将匹配3或13


3

SQLite 3.36.0 版本已于2021年6月18日发布,现在已内置 REGEXP 命令。 只适用于 CLI 构建。


参考:https://www.sqlite.org/releaselog/3_36_0.html - Manngo
3.38.0:"没有这样的函数:REGEXP" - Michael
1
那只适用于CLI构建。 - Daniel Pereira

2
您可以使用 sqlean-regexp 扩展,该扩展提供正则表达式搜索和替换功能。
基于 PCRE2 引擎,此扩展支持所有主要的正则表达式功能。它还支持 Unicode。该扩展适用于 Windows、Linux 和 macOS。
一些使用示例:
-- select messages containing number 3
select * from messages
where msg_text regexp '\b3\b';

-- count messages containing digits
select count(*) from messages
where msg_text regexp '\d+';
-- 42

select regexp_like('Meet me at 10:30', '\d+:\d+');
-- 1

select regexp_substr('Meet me at 10:30', '\d+:\d+');
-- 10:30

select regexp_replace('password = "123456"', '"[^"]+"', '***');
-- password = ***

1

你可以使用正则表达式,但这是一种愚蠢的方式来进行精确匹配。

你应该只需说WHERE x = '3'


1
我应该把它解释清楚(对我的英语表达不好感到抱歉),我只是指一个确切的值,而不是确切的字符串。无论如何还是谢谢! - cody

1

在 MySQL 的 REGEXP 函数中,您不需要在模式中指定分隔符或修改器。 - Alix Axel

1

如果有人在寻找非正则表达式的 Android Sqlite 条件,比如这个字符串 [1,2,3,4,5],那么不要忘记在 @phyatt 的条件中加上括号 ([]),同样适用于其他特殊字符,比如圆括号 ({})

WHERE ( x == '[3]' OR
        x LIKE '%,3]' OR
        x LIKE '[3,%' OR
        x LIKE '%,3,%');

0

针对Rails

            db = ActiveRecord::Base.connection.raw_connection
            db.create_function('regexp', 2) do |func, pattern, expression|
              func.result = expression.to_s.match(Regexp.new(pattern.to_s, Regexp::IGNORECASE)) ? 1 : 0
            end

0
在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

0

有一个名为sqlite_jq的SQLite扩展(https://github.com/mgdm/sqlite-jq),它允许使用jq的正则表达式函数,这些函数比SQLite的更强大,如下面两个示例中所建议的。

使用test_table.sql创建的表格(https://github.com/mgdm/sqlite-jq/blob/main/test_table.sql

sqlite> select jq(raw,'.[]|select(.id|test("6$") ).id' ) from test;
24583836616

sqlite> select jq(raw,'.[] | .actor.avatar_url | capture("https://(?<domain>[^.]*)")' ) from test;
[{"domain":"avatars"},{"domain":"avatars"}]

该扩展还提供了一个名为jq_each()的表值函数。

很棒的是,jq() 函数被标记为“确定性”的,因此可以在“CREATE INDEX”命令中使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接