【问题标题】:Unable to use REGEXP operator in System.Data.SQLite无法在 System.Data.SQLite 中使用 REGEXP 运算符
【发布时间】: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

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

提前致谢。

【问题讨论】:

    标签: c# sql regex sqlite system.data.sqlite


    【解决方案1】:

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

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

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

    【讨论】:

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

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

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

    url LIKE '%google.%q=%' 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      相关资源
      最近更新 更多