【问题标题】:SQLite: decrement value if exists AND if not 0 else set default valueSQLite:如果存在则减少值,如果不存在,则为 0,否则设置默认值
【发布时间】:2013-09-10 07:03: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)

知道如何减少选择的结果,只有当它不是 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;

【问题讨论】:

  • @CL。嗯,你知道怎么用吗?

标签: sql sqlite decrement


【解决方案1】:

我自己得到了递减:

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;

【讨论】:

  • 这是对的,但是:NULL inside COALESCE 什么都不做;在第二个SELECT 中,您缺少number>0,最后缺少右括号。你甚至测试过这个吗?
【解决方案2】:

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'
       )

【讨论】:

  • 我自己得到了这个,但是如果数字> 0,我想运行另一个SQL语句。我应该如何正确使用CASE WHEN
  • 您不能在 SQL 中执行此操作。
  • 你确定吗?然后CASE WHEN 使用了什么。根据 sql.org,CASE WHEN 描述如下:A CASE expression serves a role similar to IF-THEN-ELSE in other programming languages.
  • 它作为一个表达式,这意味着它只能用于计算单个值;例如UPDATE employees SET salary = CASE title WHEN 'Manager' THEN salary * 2 ELSE salary + 500 END.
  • 好的,你觉得这个解决方案怎么样。我添加了一个名为status 的新属性。因此,如果 number = 0,则状态应为 0,否则为 1。我只需要使用此更新您的语句('2013-09-06',):COALESCE((SELECT number FROM try WHERE ip = '172.16.1.1' AND number = 0), 1)
猜你喜欢
  • 2022-12-15
  • 2012-07-22
  • 1970-01-01
  • 2017-06-24
  • 2023-03-03
  • 1970-01-01
  • 2012-03-22
  • 2023-03-13
  • 2017-12-05
相关资源
最近更新 更多