保证搜索 Sqlite 的 "IN" 运算符的顺序?

order of search for Sqlite's "IN" operator guaranteed?

我正在执行类似于

的 Sqlite3 查询
SELECT * FROM nodes WHERE name IN ('name1', 'name2', 'name3', ...) LIMIT 1

我能保证它会首先搜索 name1,然后搜索 name2,等等吗?这样,通过将我的输出限制为 1,我知道我根据 IN 子句中的项目顺序找到了第一个匹配项?

更新: 经过一些测试,无论 IN 顺序如何,它似乎总是 return 索引中的第一个命中。它使用名称索引的顺序。有什么方法可以强制执行搜索顺序吗?

不保证 returned 行的顺序与 IN 后括号内项目的顺序相匹配。
您可以做的是在语句中使用 ORDER BY 并使用函数 INSTR():

SELECT * FROM nodes 
WHERE name IN ('name1', 'name2', 'name3') 
ORDER BY INSTR(',name1,name2,name3,', ',' || name || ',')
LIMIT 1

此代码使用 IN 子句中的相同列表作为字符串,其中项目按相同顺序、连接并用逗号分隔(假设项目不包含逗号)。
这样,结果按它们在列表中的位置排序,然后 LIMIT 1 将 return 第一个更接近列表开头的结果。

实现相同结果的另一种方法是使用 CTE 列表,其中 return 与 Id 一起用作结果的所需排序,将加入 table:

WITH list(id, item) AS (
  SELECT 1, 'name1' UNION ALL 
  SELECT 2, 'name2' UNION ALL 
  SELECT 3, 'name3' 
)
SELECT n.* 
FROM nodes n INNER JOIN list l
ON l.item = n.name 
ORDER BY l.id
LIMIT 1 

或:

WITH list(id, item) AS (
  SELECT * FROM (VALUES 
    (1, 'name1'), (2, 'name2'), (3, 'name3')
  )
)
SELECT n.* 
FROM nodes n INNER JOIN list l
ON l.item = n.name 
ORDER BY l.id
LIMIT 1 

这样您就不必重复列表两次。