在字段中查找严格的字符串
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 那样混乱!-)
我有一个数据库,其中包含一个字段'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
.
也许您想要更多,例如您摘要中的单词也可以用(例如)逗号分隔;在那种情况下,
' ' || 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 那样混乱!-)