保证搜索 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
这样您就不必重复列表两次。
我正在执行类似于
的 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
这样您就不必重复列表两次。