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

Demo on db-fiddle

排序确保如果存在完全匹配,它就是返回的值。

出于 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()+'%'))