SQLite:减量值(如果存在),如果不为0,则设置默认值

SQLite:减量值(如果存在),如果不为0,则设置默认值,sql,sqlite,decrement,Sql,Sqlite,Decrement,我是SQLite的新手,而且SQL不是我的强项,所以我需要帮助。我有一张这样的桌子: -------------------------------------- try -------------------------------------- id:INTEGER PRIMARY KEY AUTO_INCREMENT, ip:VARCHAR(30), number:INTEGER DEFAULT 10, bdate:DATE 我需要这种桌子做什么?我想禁制一个人24小时,如果他得到10倍

我是SQLite的新手,而且SQL不是我的强项,所以我需要帮助。我有一张这样的桌子:

--------------------------------------
try
--------------------------------------
id:INTEGER PRIMARY KEY AUTO_INCREMENT,
ip:VARCHAR(30),
number:INTEGER DEFAULT 10,
bdate:DATE
我需要这种桌子做什么?我想禁制一个人24小时,如果他得到10倍的错误凭证。我只想减少属性号。因此,如果此人第一次输入了错误的日志信息,则应创建一个新条目,默认数字为10。这就是我到目前为止所做的:

INSERT OR REPLACE INTO try(id, ip, number, bdate) VALUES(COALESCE((SELECT id FROM try WHERE ip="172.16.1.1"), NULL),"172.16.1.1" ,{DON'T KNOW WHAT TO FILL UP}, 06092013);
我几乎完成了,除了值的减量。我想到了这样的事情:

COALESCE((SELECT number FROM try WHERE ip="172.16.1.1"), 10)
如果选择的结果与SQL中的SET方法不同,您知道如何减少选择的结果吗?如果为0,则新语句应类似于donelike,将新条目添加到表ban ip

编辑:


我是用减量法得到的。看看我的答案,寻找解决办法

现在我想使用if-else语句。我在谷歌上搜索并找到了CASE WHEN语句,但我不知道如何使用它。我做错了什么

SELECT number FROM try WHERE ip="172.16.1.1" AS number,
CASE WHEN number > 0

THEN
(INSERT OR REPLACE INTO try(id, ip, number, bdate) VALUES(COALESCE((SELECT id FROM try WHERE ip="172.16.1.1"), NULL),"172.16.1.1" ,COALESCE(number-1, 10), 06092013)

ELSE
{DO SOMETHING ELSE}

END;

SQLite是一个嵌入式数据库,它的设计目的不是直接在SQL中执行程序逻辑。 没有IF/ELSE语句,也没有任何其他类似的语句。 您应该使用访问数据库时使用的任何语言执行逻辑:

db.executeBEGIN cursor=db.querySELECT id,try中的编号,其中ip='172.16.1.1' 如果cursor.empty或cursor.number=0: db.executeINSERT进入try valuesnall,'172.16.1.1',10,'2013-09-06' 其他: db.executeUPDATE try SET number=?其中id=?, [cursor.number-1,cursor.id] db.executeCOMMIT 如果确实希望在无法理解的SQL语句中执行此操作,请尝试以下操作:

INSERT OR REPLACE INTO try(id, ip, number, bdate)
VALUES ((SELECT id
         FROM try
         WHERE ip = '172.16.1.1'
           AND number > 0),
        '172.16.1.1',
        COALESCE((SELECT number
                  FROM try
                  WHERE ip = '172.16.1.1'
                    AND number > 0
                 ) - 1,
                 10)
        '2013-09-06'
       )

我自己用递减法得到的:

INSERT OR REPLACE INTO try(id, ip, number, bdate) VALUES(COALESCE((SELECT id FROM try WHERE ip="172.16.1.1"), NULL),"172.16.1.1" ,COALESCE((SELECT number FROM try WHERE ip="172.16.1.1")-1, 10), 06092013;

@好吧,你们知道如何使用它吗?这是我自己弄的,但若数字大于0,我想运行另一个SQL语句。如果正确,我应该如何使用CASE?您不能仅在SQL中执行此操作。您确定吗?使用时的情况。根据sql.org,CASE-WHEN描述如下:CASE表达式的作用类似于其他编程语言中的IF-THEN-ELSE;例如,当“经理”时,更新员工设置薪资=案例标题,然后是薪资*2其他薪资+500结束。好的,您认为这个解决方案如何。我添加了一个名为status的新属性。因此,如果number=0,则状态应为0,否则为1。我只需要用这个“2013-09-06”来更新您的语句:COALESCESELECT number FROM try,其中ip='172.16.1.1'和number=0,1这是正确的,但是:COALESCE内部的NULL不起任何作用;在第二个SELECT中,缺少number>0,最后缺少右括号。你测试过这个吗?