查询滞后函数的房间 Dao 出错
Error in room Dao with lag function in query
我的房间 Dao 中有这个查询,其中包含 lag() 和 lead() 函数
@Query("SELECT LAG(entry_word) OVER(ORDER BY entry_word) AS previous_word, entry_word AS current_word, LEAD(entry_word) OVER(ORDER BY entry_word) AS next_word FROM entry_words WHERE entry_word = :word") List<String> getEntryWords(String word);
但是它向我显示了这个错误
我该如何解决这个问题?
编辑:我现在在使用我当前的查询时遇到此构建错误,它说返回的是列而不是行
Window 函数在 SQLite 3.25.0 版本中引入。
可能你使用的是旧版本的 SQLite,所以你不能使用 LAG()
和 LEAD()
.
但是,即使你可以使用它们,你的查询也是错误的,它会 return NULL
for previous_word
and next_word
.
这样做的原因是因为 WHERE
子句过滤了 table 并且它 returns 只有 1 行 和 entry_word = :word
然后 LAG()
和 LEAD()
被应用,当然这两个 return NULL
因为结果集中没有上一行和下一行。
在这种情况下 LAG()
和 LEAD()
的正确用法是使用子查询:
SELECT *
FROM (
SELECT LAG(entry_word) OVER (ORDER BY entry_word) AS previous_word,
entry_word AS current_word,
LEAD(entry_word) OVER (ORDER BY entry_word) AS next_word
FROM entry_words
)
WHERE current_word = :word
对于 3.25.0 之前的 SQLite 版本,您可以对相关子查询执行相同的操作:
SELECT (SELECT MAX(e2.entry_word) FROM entry_words e2 WHERE e2.entry_word < e1.entry_word) AS previous_word,
e1.entry_word AS current_word,
(SELECT MIN(e2.entry_word) FROM entry_words e2 WHERE e2.entry_word > e1.entry_word) AS next_word
FROM entry_words e1
WHERE e1.entry_word = :word
我的房间 Dao 中有这个查询,其中包含 lag() 和 lead() 函数
@Query("SELECT LAG(entry_word) OVER(ORDER BY entry_word) AS previous_word, entry_word AS current_word, LEAD(entry_word) OVER(ORDER BY entry_word) AS next_word FROM entry_words WHERE entry_word = :word") List<String> getEntryWords(String word);
但是它向我显示了这个错误
我该如何解决这个问题?
编辑:我现在在使用我当前的查询时遇到此构建错误,它说返回的是列而不是行
Window 函数在 SQLite 3.25.0 版本中引入。
可能你使用的是旧版本的 SQLite,所以你不能使用 LAG()
和 LEAD()
.
但是,即使你可以使用它们,你的查询也是错误的,它会 return NULL
for previous_word
and next_word
.
这样做的原因是因为 WHERE
子句过滤了 table 并且它 returns 只有 1 行 和 entry_word = :word
然后 LAG()
和 LEAD()
被应用,当然这两个 return NULL
因为结果集中没有上一行和下一行。
在这种情况下 LAG()
和 LEAD()
的正确用法是使用子查询:
SELECT *
FROM (
SELECT LAG(entry_word) OVER (ORDER BY entry_word) AS previous_word,
entry_word AS current_word,
LEAD(entry_word) OVER (ORDER BY entry_word) AS next_word
FROM entry_words
)
WHERE current_word = :word
对于 3.25.0 之前的 SQLite 版本,您可以对相关子查询执行相同的操作:
SELECT (SELECT MAX(e2.entry_word) FROM entry_words e2 WHERE e2.entry_word < e1.entry_word) AS previous_word,
e1.entry_word AS current_word,
(SELECT MIN(e2.entry_word) FROM entry_words e2 WHERE e2.entry_word > e1.entry_word) AS next_word
FROM entry_words e1
WHERE e1.entry_word = :word