【问题标题】:For some reason the COALESE returns 0 instead of the correct value由于某种原因,COALESE 返回 0 而不是正确的值
【发布时间】:2015-02-09 09:30:42
【问题描述】:

我目前正在构建一个使用 SQLite 的 PhoneGap / Cordova 应用程序

function screenONEpress(tx) 
{
    tx.executeSql(   

    "INSERT OR REPLACE INTO PILE (word, frequency) 
     VALUES ( ?,   COALESCE( (SELECT frequency FROM PILE WHERE word = ?), 0) + 1  )",

                [screen1targetword] , errorcode

                        );
}

名为 PILE 的表包含标题为单词、含义和频率的列。

它确实找到了正确的值。如果我显示表的所有值并且看不到重复值。但是,由于某种原因,在运行上面的 SQL 语句时,频率总是变成 1,意思是,

SELECT frequency FROM PILE WHERE word = ? 

返回零。

【问题讨论】:

  • 您在插入语句中提供了 两个 占位符 (?)。您不应该为它们提供两个单独的值吗?即[screen1targetword,screen1targetword]。假设您在这两个地方都需要screen1targetword

标签: javascript sql database sqlite cordova


【解决方案1】:

正如 frank 所说,你有两个参数,并且只给出一个值,所以第二个总是 NULL。

要么给出两个参数值:

tx.executeSql("... ? ... ? ...",
              [screen1targetword, screen1targetword], ...);

或在两个地方都使用same parameter

tx.executeSql("... ?1 ... ?1 ...",
              [screen1targetword], ...);

【讨论】:

  • 谢谢,圣诞快乐,老朋友
【解决方案2】:

如果你这样写查询会发生什么?

INSERT OR REPLACE INTO PILE (word, frequency) 
     SELECT ?,  COALESCE(MAX(frequency), 0) + 1, [screen1targetword] , errorcode
     FROM pile
     WHERE word = ?;

这应该是相同的逻辑,但您可以直接测试select 以确保它返回正确的值。

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2018-01-28
    相关资源
    最近更新 更多