【问题标题】:Error in room Dao with lag function in query查询中带有滞后功能的房间道出错
【发布时间】:2021-05-28 13:33:09
【问题描述】:

我的房间 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);

但它显示了这个错误

我该如何解决这个问题?

编辑:我现在使用当前查询时遇到此构建错误,该查询说返回的是列而不是行

【问题讨论】:

    标签: android sqlite android-sqlite android-room


    【解决方案1】:

    在 SQLite 3.25.0 版本中引入了窗口函数。
    可能您使用的是旧版本的 SQLite,因此您不能使用 LAG()LEAD()
    但是,即使您可以使用它们,您的查询也是错误的,它会为 previous_wordnext_word 返回 NULL
    这样做的原因是因为WHERE 子句过滤了表,它返回只有1 行entry_word = :word,然后LAG()LEAD() 被应用,当然两者都返回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
    

    【讨论】:

    • 感谢您的回复,我尝试了您提供的第二个查询,但最终出现构建错误(请检查新帖子编辑)
    • @HaleemahAbdullahi 我的答案是针对您发布的问题。如果你有一个新问题,你应该提出一个新问题。
    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 2021-06-25
    • 2018-07-02
    • 2022-07-06
    • 2015-12-10
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多