无法在 System.Data.SQLite 中使用 REGEXP 运算符
Unable to use REGEXP operator in System.Data.SQLite
假设我有以下 table 和其中的数据:
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');
我需要 select 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"]);
}
但它给了我以下错误:
An unhandled exception of type 'System.Data.SQLite.SQLiteException'
occurred in System.Data.SQLite.dll
Additional information: SQL logic error or missing database
no such function: REGEXP
有什么办法可以解决吗?如果没有,我可以做什么?
提前致谢。
SQLite 没有内置 regexp()
函数,如 documentation:
中所述
The REGEXP operator is a special syntax for the regexp() user
function. No regexp() user function is defined by default and so use
of the REGEXP operator will normally result in an error message. If an
application-defined SQL function named "regexp" is added at run-time,
then the "X REGEXP Y" operator will be implemented as a call to
"regexp(Y,X)".
我承认数据库只支持语法而不支持底层函数是不寻常的。但是,提供您自己的功能应该很容易。
regexp
比较运算符不是 SQL 标准的一部分。它是特定于 mysql 的扩展。
也许你可以直接使用like。这应该做同样的事情:
url LIKE '%google.%q=%'
假设我有以下 table 和其中的数据:
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');
我需要 select 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"]);
}
但它给了我以下错误:
An unhandled exception of type 'System.Data.SQLite.SQLiteException' occurred in System.Data.SQLite.dll
Additional information: SQL logic error or missing database
no such function: REGEXP
有什么办法可以解决吗?如果没有,我可以做什么?
提前致谢。
SQLite 没有内置 regexp()
函数,如 documentation:
The REGEXP operator is a special syntax for the regexp() user function. No regexp() user function is defined by default and so use of the REGEXP operator will normally result in an error message. If an application-defined SQL function named "regexp" is added at run-time, then the "X REGEXP Y" operator will be implemented as a call to "regexp(Y,X)".
我承认数据库只支持语法而不支持底层函数是不寻常的。但是,提供您自己的功能应该很容易。
regexp
比较运算符不是 SQL 标准的一部分。它是特定于 mysql 的扩展。
也许你可以直接使用like。这应该做同样的事情:
url LIKE '%google.%q=%'