(如果你能想到一个更好的标题,请说)
所以我有一个包含我希望能够搜索的表的数据库。按我的搜索输入intel core i5
,我希望在任何排列中包含名称包含intel
,core
和i5
列的任何行,这些字词周围的字符或任何其他任何地方。
到目前为止,我正在做:
search = "intel core i5" # This is taken from an entry field.
words = []
for word in search.split()
words.append("%" + word.strip() + "%")
results = db_handler.query("""SELECT Table1.ID
FROM Table1
JOIN Table2
ON Table1.ID2 = Table2.ID
WHERE Table2.Name LIKE({0}) AND
Active=1""".format(", ".join("?" for _ in self.words)), self.words)
# db_handler.query is a method which queries and returns results. Plus some other stuff.
# In Table1 there is some columns like ID, ID2, Active, eta
# ID2 matches ID in Table2 which also contains Name
# So I want ID from Table1 searched by Name from Table2
但这不起作用,因为LIKE不会超过一个arg。 (可能有一种更好的方法,而不是分割输入,但我这样做是因为这是有意义的,是吗?)我看到一些人有一些不同的问题建议REGEXP但我看了但是并没有真正得到我的使用。如果这是最好的,你能解释一下感谢。我该怎么做?
由于
答案 0 :(得分:2)
LIKE
采用一种模式,但您可以在其中加入多个关键字,例如:
... LIKE '%intel%core%i5%' ...
这将匹配包含intel
后跟core
后跟i5
的值,其中包含之前,之后和之间的任意字符串。
要查找包含任何安排的记录,
你需要使用所有排列的多个LIKE
子句(在这个例子中有6个),并且OR
他们在一起,例如:
... (Table2.Name LIKE '%intel%core%i5%' OR Table2.Name LIKE '%intel%i5%core%' OR ...) ...
在上下文中:
from itertools import permutations
search = "intel core i5"
words = [word.strip() for word in search.split()]
combinations = ["%" + "%".join(order) + "%" for order in list(permutations(words)]
sql = """SELECT <Columns> FROM <Table>
WHERE [Other ...]
(<Col> LIKE {0})""".format(" OR <Col> LIKE ".join("?" for _ in combinations))
values = combinations # sql and values/combinations to be sent to a query function.
答案 1 :(得分:1)
让我们假设(考虑一般问题)您希望能够找到包含列表中任何或所有单词的行,或者在words
列中设置col
。让我们进一步假设您完全了解SQL注入攻击的风险,因此您在将任何用户输入包含在words
之前完全清理它。
您希望单个单词w
的查询条件可以用Python表示为
"{0} LIKE '%{}%'".format(col, w)
单个字段查询需要与“OR”连接以查找任何术语,或“AND”以查找所有术语。因此,您可以将joiner
设置为' AND '
或' OR '
,然后整个查询搜索条件将为
joiner.join(["{0} LIKE '%{1}%'".format(col, w) for w in words])
如果您设置
words = "intel core i5".split()
joiner = " AND "
col = "Table2.name"
这评估为
Table2.name LIKE '%intel%' AND Table2.name LIKE '%core%' AND Table2.name LIKE '%i5%'
你显然已经知道足够多的Python能够用你想做的事情。