假设我在其中包含以下表格和数据:
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
有什么办法可以解决吗?如果不是,我该怎么办呢?
提前致谢。
答案 0 :(得分:3)
SQLite没有内置regexp()
功能,如documentation中所述:
REGEXP运算符是regexp()用户的特殊语法 功能。默认情况下没有定义regexp()用户函数,因此请使用 REGEXP运算符通常会导致错误消息。如果 应用程序定义的SQL函数名为" regexp"在运行时添加, 那么" X REGEXP Y"运营商将实施为呼叫 "正则表达式(Y,X)"
我承认,数据库支持语法但不支持底层函数是不常见的。但是,提供自己的功能应该很容易。
答案 1 :(得分:0)
regexp
比较运算符不是SQL标准的一部分。它是特定于mysql的扩展。
也许你可以使用喜欢。这应该做同样的事情:
url LIKE '%google.%q=%'