Sqlite3 Order By 与输入的相关性
Sqlite3 Order By relevance to the input
c = conn.cursor()
search = "SELECT * FROM chavacanowords WHERE filipinoword = ? OR filipinoword = ? OR filipinoword LIKE ? OR filipinoword LIKE ?"
c.execute(search, ('%'+i+'%', '%'+i.title()+'%', '%'+i+'%', '%'+i.title()+'%'))
result = c.fetchone()
if result:
translatedwords.append(result[0])
else:
translatedwords.append(i)
我正在尝试匹配用户输入的字词。但是,c.fecthone() 获取数据库中最早的条目。
用户输入:Sara
数据库:(Sabroso、Sarap)(Trangka、Sara)
翻译:Sabroso(因为 Sabroso 在数据库中比 Trangka 更早)
我正在尝试通过“filipinoword = ? OR filipinoword = ?”过滤掉所有准确的条目如果完全匹配不存在,则尝试搜索相似性“filipinoword LIKE?或 filipinoword LIKE?”
我怎样才能做到完全匹配在前,如果 none 然后继续 LIKE 部分?
您可以修改查询以使用包含两个查询的 UNION
,第一个查找完全匹配,第二个查找不精确匹配。标志用于确定匹配是否准确,结果按该标志排序。例如:
SELECT translation, filipinoword
FROM (
SELECT *, 1 AS exactmatch
FROM chavacanowords
WHERE filipinoword = 'sara' OR filipinoword = 'Sara'
UNION ALL
SELECT *, 0 AS exactmatch
FROM chavacanowords
WHERE filipinoword LIKE '%sara%' OR filipinoword LIKE '%Sara%'
) m
ORDER BY exactmatch DESC
LIMIT 1
排序确保如果存在完全匹配,它就是返回的值。
出于 python 目的,您可以将 WHERE
子句中的字符串替换为 ?
并将它们作为参数传递,即
search = "SELECT translation, filipinoword \
FROM ( \
SELECT *, 1 AS exactmatch \
FROM chavacanowords \
WHERE filipinoword = ? OR filipinoword = ? \
UNION ALL \
SELECT *, 0 AS exactmatch \
FROM chavacanowords \
WHERE filipinoword LIKE ? OR filipinoword LIKE ? \
) m \
ORDER BY exactmatch DESC \
LIMIT 1"
c.execute(search, (i, i.title(), '%'+i+'%', '%'+i.title()+'%'))
c = conn.cursor()
search = "SELECT * FROM chavacanowords WHERE filipinoword = ? OR filipinoword = ? OR filipinoword LIKE ? OR filipinoword LIKE ?"
c.execute(search, ('%'+i+'%', '%'+i.title()+'%', '%'+i+'%', '%'+i.title()+'%'))
result = c.fetchone()
if result:
translatedwords.append(result[0])
else:
translatedwords.append(i)
我正在尝试匹配用户输入的字词。但是,c.fecthone() 获取数据库中最早的条目。
用户输入:Sara
数据库:(Sabroso、Sarap)(Trangka、Sara)
翻译:Sabroso(因为 Sabroso 在数据库中比 Trangka 更早)
我正在尝试通过“filipinoword = ? OR filipinoword = ?”过滤掉所有准确的条目如果完全匹配不存在,则尝试搜索相似性“filipinoword LIKE?或 filipinoword LIKE?”
我怎样才能做到完全匹配在前,如果 none 然后继续 LIKE 部分?
您可以修改查询以使用包含两个查询的 UNION
,第一个查找完全匹配,第二个查找不精确匹配。标志用于确定匹配是否准确,结果按该标志排序。例如:
SELECT translation, filipinoword
FROM (
SELECT *, 1 AS exactmatch
FROM chavacanowords
WHERE filipinoword = 'sara' OR filipinoword = 'Sara'
UNION ALL
SELECT *, 0 AS exactmatch
FROM chavacanowords
WHERE filipinoword LIKE '%sara%' OR filipinoword LIKE '%Sara%'
) m
ORDER BY exactmatch DESC
LIMIT 1
排序确保如果存在完全匹配,它就是返回的值。
出于 python 目的,您可以将 WHERE
子句中的字符串替换为 ?
并将它们作为参数传递,即
search = "SELECT translation, filipinoword \
FROM ( \
SELECT *, 1 AS exactmatch \
FROM chavacanowords \
WHERE filipinoword = ? OR filipinoword = ? \
UNION ALL \
SELECT *, 0 AS exactmatch \
FROM chavacanowords \
WHERE filipinoword LIKE ? OR filipinoword LIKE ? \
) m \
ORDER BY exactmatch DESC \
LIMIT 1"
c.execute(search, (i, i.title(), '%'+i+'%', '%'+i.title()+'%'))