1

我是 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)

知道如何仅当它不是 0 时才从选择中减少结果(如 SQL 中的 SET 方法)?如果为 0,则应执行新语句(如向表禁止 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;
4

2 回答 2

0

SQLite 是一个嵌入式数据库,并非旨在直接在 SQL 中执行程序逻辑。没有IF/ELSE语句,或任何其他类似的语句。您应该使用您用来访问数据库的任何语言来执行逻辑:

db.execute("BEGIN")
cursor = db.query("SELECT id, number FROM try WHERE ip = '172.16.1.1'")
if cursor.empty or cursor.number = 0:
    db.execute("INSERT INTO try VALUES(NULL, '172.16.1.1', 10, '2013-09-06')")
else:
    db.execute("UPDATE try SET number = ? WHERE id = ?",
               [cursor.number - 1, cursor.id])
db.execute("COMMIT")

如果您真的想在难以理解的 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'
       )
于 2013-09-06T09:05:42.600 回答
0

我自己减少了它:

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;
于 2013-09-06T09:20:30.537 回答