在字段中查找严格的字符串

Find a strict string in a field

我有一个数据库,其中包含一个字段'topic'。这个字段是一个简短的文本,大约200-300个字,我会说。

我需要在这个字段中找到一个字符串,但是以特定的方式:该字段必须包含指定的字符串。它不能是另一个词的子串。比如

SELECT * FROM table WHERE abstract like '%myString%"

不可能,因为它也会returnsomething+my_string+something.

SELECT * FROM table WHERE abstract like '_myString_"

也不行,因为我的字段可能以 myString 开头,但它不匹配。

我很想使用 REGEXP,但 sqlite 似乎还不支持它。 我读到可以对其进行调整,并使用个人功能,但我需要一种方法来为 PyQt 实现它,以便在我的应用程序中使用它。

如果我理解正确,你想要 select 记录,其中 abstract 你的字符串 'myString' 显示为由空格分隔的单词 and/or 字符串的任一端.你说的不是这样——"only the string, and nothing else" 引用你的话——但如果确实如此,那么显然 WHERE abstract = 'myString' 就足够了;因此我推断你是在追求别的东西,不管你说什么。

所以,如果我没看错你的想法,那么

WHERE ' ' || abstract || ' ' LIKE '% myString %'

会完成这项工作——通过在实际 abstract.

前后连接空格,绕过您对 "my field could start with myString, and it would not match" 的担心

也许您想要更多,例如您摘要中的单词也可以用(例如)逗号分隔;在那种情况下,

' ' || replace(abstract, ',', ' ') || ' ' LIKE '% myString %'

就可以了。当然,如果有太多可能的标点符号字符需要用这种方式处理,由于 replace 的 "cascade",这会变得很麻烦,而这正是对正则表达式的渴望变得强烈的地方。在那种情况下 确实可以使用正则表达式库来增强 sqlite(取决于你使用的平台:我不明白 PyQt 与这个问题有什么关系),但它可能很乱。请参阅 How do I use regex in a SQLite query? 如果那真的是您可以追求的唯一途径...尽管 Python 可能会更容易,例如:

import sqlite3
import re

def resub(pat, sub, s):
return re.sub(pat, sub, s)

con = sqlite3.connect(":memory:")
con.create_function("resub", 3, resub)
cur = con.cursor()
cur.execute("select resub('[,!?]',' ', 'O Romeo, Romeo, wherefore art thou Romeo?')")
print cur.fetchone()[0]

根据需要显示 "O Romeo Romeo wherefore art thou Romeo "...所以也许它不像其他非 Python 使用的 sqlite 那样混乱!-)