无法在 System.Data.SQLite 中使用 REGEXP 运算符

Posted

技术标签:

【中文标题】无法在 System.Data.SQLite 中使用 REGEXP 运算符【英文标题】:Unable to use REGEXP operator in System.Data.SQLite 【发布时间】:2015-05-23 19:45:09 【问题描述】:

假设我有下面的表格和里面的数据:

CREATE TABLE urls (url TEXT);
INSERT INTO urls VALUES('https://www.google.ru/?gws_rd=ssl#newwindow=1&q=&safe=off');
INSERT INTO urls VALUES('https://www.google.ru/?gws_rd=ssl#newwindow=1&safe=off&q=1');
INSERT INTO urls VALUES('https://www.google.ru/?gws_rd=ssl#newwindow=1&q=2&safe=off');
INSERT INTO urls VALUES('https://www.google.ru/?gws_rd=ssl#newwindow=1&q=23&safe=off');

我需要选择所有 URL 包含非空查询参数的记录(在这种情况下,除了第一条记录)。

我正在使用 SQLite,所以我决定像这样使用 REGEXP 运算符:

string sql = @"SELECT * FROM urls WHERE url REGEXP '\/(?:www\.)?google.+?q=([^&]+)(?:&|$)'";
var command = new SQLiteCommand(sql, dbConnection);
SQLiteDataReader reader = command.ExecuteReader();
while (reader.Read())

    Console.WriteLine("Url: " + reader["url"]);

但它给了我以下错误:

“System.Data.SQLite.SQLiteException”类型的未处理异常 发生在 System.Data.SQLite.dll 中

附加信息:SQL 逻辑错误或缺少数据库

没有这样的功能:REGEXP

有什么办法可以解决吗?如果没有,我该怎么办?

提前致谢。

【问题讨论】:

【参考方案1】:

SQLite 没有内置的regexp() 函数,如documentation 中所述:

REGEXP 运算符是 regexp() 用户的特殊语法 功能。默认情况下没有定义 regexp() 用户函数,因此使用 的 REGEXP 运算符通常会导致错误消息。如果 在运行时添加名为“regexp”的应用程序定义的 SQL 函数, 那么“X REGEXP Y”运算符将被实现为调用 “正则表达式(Y,X)”。

我承认数据库支持语法但不支持底层功能是不寻常的。但是,提供您自己的功能应该很容易。

【讨论】:

如何提供我自己的正则表达式函数?有实现吗?【参考方案2】:

regexp 比较运算符不是 SQL 标准的一部分。它是特定于 mysql 的扩展。

也许你可以使用like。这应该做同样的事情:

url LIKE '%google.%q=%' 

【讨论】:

以上是关于无法在 System.Data.SQLite 中使用 REGEXP 运算符的主要内容,如果未能解决你的问题,请参考以下文章

Win 2K8 Server计算机上的Visual Studio 2010无法识别System.Data.Sqlite

无法加载文件或程序集“System.Data.SQLite”或它的一个依赖。试图加载程序格式不正确

系统.data.sqlite .net 4

System.Data.SQLite数据库简介

C# 引入Sqlite 未能加载文件或程序集“System.Data.SQLite

使用 System.Data.SQLite 和 C# 检索 BLOB