我想在sqlite中使用正则表达式,但是不知道怎么做。
我的表格有一个列,其中包含像这样的字符串:“3,12,13,14,19,28,32”。 现在,如果我输入“where x LIKE '3'”,我也会得到包含值13或32之类的行, 但是我只想得到具有该字符串中确切值3的行。
有人知道如何解决这个问题吗?
我想在sqlite中使用正则表达式,但是不知道怎么做。
我的表格有一个列,其中包含像这样的字符串:“3,12,13,14,19,28,32”。 现在,如果我输入“where x LIKE '3'”,我也会得到包含值13或32之类的行, 但是我只想得到具有该字符串中确切值3的行。
有人知道如何解决这个问题吗?
正如其他人已经指出的那样,REGEXP调用了一个用户定义的函数,必须先定义并加载到数据库中。也许某些SQLite发行版或GUI工具默认包含它,但我的Ubuntu安装没有包含它。解决方案是
sudo apt-get install sqlite3-pcre
该模块在/usr/lib/sqlite3/pcre.so
中实现了Perl正则表达式。
为了能够使用它,每次打开数据库时都需要加载它:
.load /usr/lib/sqlite3/pcre.so
或者,你可以将那行代码放入你的~/.sqliterc
文件中。
现在你可以这样查询:
SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';
如果你想直接从命令行查询,你可以使用-cmd
开关在执行 SQL 前加载库:
sqlite3 "$filename" -cmd ".load /usr/lib/sqlite3/pcre.so" "SELECT fld FROM tbl WHERE fld REGEXP '\b3\b';"
如果你使用的是Windows操作系统,我猜想类似的.dll文件应该可以在某个地方找到。regex()
函数来支持REGEXP
运算符,该怎么做?默认情况下尚未添加用户函数。 - KenREGEXP
,它默认就可以使用。 - renardesquewhere ',' || x || ',' like '%,3,%'
',' || x || ','
。此语句意为在变量x前后加上逗号。 - BaruchSQLite默认不包含正则表达式功能。
它定义了一个REGEXP
运算符,但是如果您或您的框架没有定义一个名为regexp()
的用户函数,则会失败并显示错误消息。如何执行此操作取决于您的平台。
如果您已经定义了regexp()
函数,则可以像这样匹配逗号分隔列表中的任意整数:
... WHERE your_column REGEXP "\b" || your_integer || "\b";
但实际上,如果您通过用单独的行替换逗号分隔列表中的组在单个列中,使数据库结构标准化, 您会发现事情变得更加容易。然后,您不仅可以使用=
运算符而不是正则表达式,还可以使用SQL提供的更强大的关系工具,如连接。
一个在PHP/PDO中实现了REGEXP
关键字,模拟MySQL行为的SQLite UDF:
$pdo->sqliteCreateFunction('regexp',
function ($pattern, $data, $delimiter = '~', $modifiers = 'isuS')
{
if (isset($pattern, $data) === true)
{
return (preg_match(sprintf('%1$s%2$s%1$s%3$s', $delimiter, $pattern, $modifiers), $data) > 0);
}
return null;
}
);
u
修饰符在MySQL中未实现,但我发现将其默认设置会很有用。例如:
u
modifier is not implemented in MySQL, but I find it useful to have it by default. Examples:
SELECT * FROM "table" WHERE "name" REGEXP 'sql(ite)*';
SELECT * FROM "table" WHERE regexp('sql(ite)*', "name", '#', 's');
如果$data
或$pattern
之一为NULL,则结果为NULL - 就像在MySQL中一样。
我在Python中使用sqlite3的解决方案:
import sqlite3
import re
def match(expr, item):
return re.match(expr, item) is not None
conn = sqlite3.connect(':memory:')
conn.create_function("MATCHES", 2, match)
cursor = conn.cursor()
cursor.execute("SELECT MATCHES('^b', 'busy');")
print cursor.fetchone()[0]
cursor.close()
conn.close()
如果正则表达式匹配成功,输出将为1,否则为0。使用Python,假设con
是SQLite的连接,你可以通过编写以下代码来定义所需的UDF:
con.create_function('regexp', 2, lambda x, y: 1 if re.search(x,y) else 0)
import re
import sqlite3
with sqlite3.connect(":memory:") as con:
con.create_function('regexp', 2, lambda x, y: 1 if re.search(x,y) else 0)
cursor = con.cursor()
# ...
cursor.execute("SELECT * from person WHERE surname REGEXP '^A' ")
if x 不为 Null and y 不为 Null and re.search(x,y)
,否则它会抛出异常。 - pholat使用完整的或运算 where 子句可以避免使用字符串连接:
WHERE ( x == '3' OR
x LIKE '%,3' OR
x LIKE '3,%' OR
x LIKE '%,3,%');
包括四种情况:精确匹配、列表末尾、列表开头和列表中间。
这种方法更加详细,不需要使用正则表达式扩展。
UPDATE TableName
SET YourField = ''
WHERE YourField REGEXP 'YOUR REGEX'
并且:
SELECT * from TableName
WHERE YourField REGEXP 'YOUR REGEX'