SQlite插入或替换条件是每列值大于其当前值

SQlite插入或替换条件是每列值大于其当前值,sql,sqlite,Sql,Sqlite,我的情况是,我可以让同一张唱片出现几次 问题是某些字段可能丢失,这由该字段中的值-1表示。该字段的值将按正确值或-1显示。正确的值将始终为正值。问题是,我事先不知道哪些字段将丢失,并且每个记录的丢失字段集可能不同。我的目标是在数据库中有一个最终条目,它汇集了所有正确的值 我希望能够插入并替换那些值增加的列。考虑到唯一可能的值是-1,并且正确的值是正数,这将确保我得到尽可能多的正确行,当然,可能会从所有记录中省略一些列 conn = sqlite3.connect('example.db') c

我的情况是,我可以让同一张唱片出现几次

问题是某些字段可能丢失,这由该字段中的值-1表示。该字段的值将按正确值或-1显示。正确的值将始终为正值。问题是,我事先不知道哪些字段将丢失,并且每个记录的丢失字段集可能不同。我的目标是在数据库中有一个最终条目,它汇集了所有正确的值

我希望能够插入并替换那些值增加的列。考虑到唯一可能的值是-1,并且正确的值是正数,这将确保我得到尽可能多的正确行,当然,可能会从所有记录中省略一些列

conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE table IF NOT EXISTS SearchTable ([Owner] INTEGER  
PRIMARY KEY, [Val1] INT, [Val2] INT)''')
c.execute("""INSERT OR REPLACE INTO SearchTable (Val1, Val2) values(-1, 
5)""")
c.execute("""INSERT OR REPLACE INTO SearchTable (Owner, Val1, Val2) 
values(1, 7, -1)""")
上面的代码是我的尝试我对sql还是新手显然这是错误的,它会更新两个列,而不管它们的当前值如何,但是它应该只更新Val1,因为Val1增加了,而Val2应该保持不变,因为它减少了

下面的问题似乎要求类似的东西,但在这种情况下,您有一个完整的数据集进行比较,您不知道在我的情况下,如果任何REC是完整的。因此,我无法将此解决方案推广到我的问题

这个问题我真的一点也不明白答案,但也许它能帮助你解决我的问题


我相信以下就是你想做的事情

如果您有3.24.0或更高版本的SQlite,则可以使用UPSERT更新或insert

e、 g:-

DROP TABLE IF EXISTS SearchTable;
CREATE TABLE IF NOT EXISTS SearchTable ([Owner] INTEGER PRIMARY KEY, [Val1] INT, [Val2] INT);

INSERT INTO SearchTable (Owner,Val1,Val2) VALUES(null,-1,5) 
    ON CONFLICT(Owner) DO UPDATE 
        SET 
            Val1 = CASE WHEN Val1 < 0 AND -1 /*<<<<<<<<<< value for val1 */ > 0 THEN -1 /*<<<<<<<<<< value for val1 */ ELSE Val1 END, 
            Val2 = CASE WHEN Val2 < 0 AND 5 /*<<<<<<<<<< value for val2 */ > 0 THEN 5 /*<<<<<<<<<< value for val2 */ ELSE Val2 END
;
INSERT INTO SearchTable (Owner,Val1,Val2) VALUES(1,7,-1) 
    ON CONFLICT(Owner) DO UPDATE 
        SET Val1 = CASE WHEN Val1 < 0 AND 7 /*<<<<<<<<< value for val1 */ > 0 THEN 7 /*<<<<<<<<<< value for val1 */ ELSE Val1 END, 
        Val2 = CASE WHEN Val2 < 0 AND 5 /*<<<<<<<<<<< value for val2 */ > 0 THEN 5 /*<<<<<<<<<< value for val2 */ ELSE Val2 END
    ;
结果:-

sqlite> INSERT INTO SearchTable (Owner,Val1,Val2) VALUES(null,-1,5) ON CONFLICT(Owner) DO UPDATE SET Val1 = CASE WHEN Val1 < 0 AND -1 > 0 THEN -1 ELSE Val1 END , Val2 = CASE WHEN Val2 < 0 AND 5 > 0 THEN 5 ELSE Val2 END;
sqlite> select * from SearchTable;
1|-1|5
sqlite> INSERT INTO SearchTable (Owner,Val1,Val2) VALUES(1,7,-1) ON CONFLICT(Owner) DO UPDATE SET Val1 = CASE WHEN Val1 < 0 AND 7 > 0 THEN 7 ELSE Val1 END, Val2 = CASE WHEN Val2 < 0 AND 5 > 0 THEN 5 ELSE Val2 END;
sqlite> select * from SearchTable;
1|7|5
注:下一个示例包括更多解释性说明,其中许多适用。

如果SQLite版本低于3.24.0,则考虑:-< /P>

DROP TABLE IF EXISTS SearchTable;
CREATE TABLE IF NOT EXISTS SearchTable ([Owner] INTEGER PRIMARY KEY, [Val1] INT, [Val2] INT);

-- First Insert (null -1,5)
INSERT OR REPLACE INTO SearchTable ([Owner],Val1, Val2) VALUES(null /* owner null if first insert and auto generated value required, else known owner value */, 
    -- Handle VAL1 column
        CASE
            -- if no owner matching supplied value
            WHEN (SELECT Val1 FROM SearchTable WHERE [owner] = null /*<<<<<<<<<< owner value */) IS NULL THEN -1 /* 1st value */
            -- if current value is -1 then use supplied value
            WHEN (SELECT Val1 FROM SearchTable WHERE [owner] = null /*<<<<<<<<< owner value */) = -1 THEN -1 /* 1st value */
            -- if current value is o or greater then use current value
            WHEN (SELECT Val1 FROM SearchTable WHERE [owner] = null /*<<<<<<<<< owner value */) > -1 THEN (SELECT Val1 FROM SearchTable WHERE [owner] = null /*<<<<<<<<<< owner value */)
        END,
        -- Handle Val2 Column
        CASE 
            -- if no owner matching supplied value
            WHEN (SELECT Val2 FROM SearchTable WHERE [owner] = null /*<<<<<<<<<< owner value */) IS NULL THEN 5 /* 2nd value */
            -- if current value is -1 then use supplied value
            WHEN (SELECT Val2 FROM SearchTable WHERE [owner] = null /*<<<<<<<<< owner value */) = -1 THEN 5 /* 2nd value */
            -- if current value is 0 or greater then use current value
            WHEN (SELECT Val2 FROM SearchTable WHERE [owner] = null /*<<<<<<<<< owner value */) > -1 THEN (SELECT Val2 FROM SearchTable WHERE [owner] = null /*<<<<<<<<<< owner value */)
        END
);
-- Show result 1
SELECT * FROM SearchTable;

-- Second Insert (1,7,-1) !!!!Assumes that 5 should change to -1
INSERT OR REPLACE INTO SearchTable ([Owner],Val1, Val2) VALUES(1 /* owner null if first insert and auto generated value required, else known owner value */, 
    -- Handle VAL1 column
        CASE
            -- if no owner matching supplied value
            WHEN (SELECT Val1 FROM SearchTable WHERE [owner] = 1 /*<<<<<<<<<< owner value */) IS NULL THEN 7 /* 1st value */
            -- if current value is -1 then use supplied value
            WHEN (SELECT Val1 FROM SearchTable WHERE [owner] = 1 /*<<<<<<<<< owner value */) = -1 THEN 7 /* 1st value */
            -- if current value is 0 or greater then use current value
            WHEN (SELECT Val1 FROM SearchTable WHERE [owner] = 1 /*<<<<<<<<< owner value */) > -1 THEN (SELECT Val1 FROM SearchTable WHERE [owner] = null /*<<<<<<<<<< owner value */)
        END,
        -- Handle Val2 Column
        CASE 
            -- if no owner matching supplied value
            WHEN (SELECT Val2 FROM SearchTable WHERE [owner] = 1 /*<<<<<<<<<< owner value */) IS NULL THEN -1 /* 2nd value */
            -- if current value is -1 then use supplied value
            WHEN (SELECT Val2 FROM SearchTable WHERE [owner] = 1 /*<<<<<<<<< owner value */) = -1 THEN -1 /* 2nd value */
            -- if current value is 0 or greater then use current value
            WHEN (SELECT Val2 FROM SearchTable WHERE [owner] = 1 /*<<<<<<<<< owner value */) > -1 THEN (SELECT Val2 FROM SearchTable WHERE [owner] = 1 /*<<<<<<<<<< owner value */)
        END
);
-- Show result 2
SELECT * FROM SearchTable;
这将首先使用提供的3个值[owner]、val1和val1 null、-1和5,根据以下内容为owner is null添加行值:-

第二次使用值[owner]、val1和val1、7和-1来修改行

根据我对以下内容的解释,Val2未更新:-

我希望能够插入和替换这些列 它的价值增加了。假设唯一可能的值是-1 正确的值是正的,这应该确保我结束 当然,尽可能多地找到正确的行 所有记录中省略了某些列

conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE table IF NOT EXISTS SearchTable ([Owner] INTEGER  
PRIMARY KEY, [Val1] INT, [Val2] INT)''')
c.execute("""INSERT OR REPLACE INTO SearchTable (Val1, Val2) values(-1, 
5)""")
c.execute("""INSERT OR REPLACE INTO SearchTable (Owner, Val1, Val2) 
values(1, 7, -1)""")
根据:-


您声明要插入或替换值已增加的列,但1如何知道哪些列已增加,2如何确定哪些行应使用增加的值进行更新?甚至所有者主键也可以是-1吗?您确实需要显示示例数据,否则这真的没有任何意义。顺便说一句,插入或替换的主要条件是:如果主键存在,则用新数据替换行,否则用新主键插入新行。其他答案中的关键思想是使用INSERT或REPLACE语句而不是值列表。额外的条件放在SELECT语句的WHERE条件中,该条件可以控制SELECT语句是否返回任何行。如果SELECT语句条件总体上为false,那么它将不返回任何行,因此不会返回insert/replace。这真的是一个很好的数据库应用程序吗?在我看来,使用内存中的语言构造字典可以更容易、更有效地处理这个问题?而不是数据库表。这些行是否需要在应用程序会话之间保持?是否会有许多行超出内存限制?找到最终参赛作品的目标会在一次会议中实现吗?数据可能会被保存并重新加载到另一个更适合您的动态需求的构造中。值-1是必要的吗?或者您可以使用null吗?如果使用null,可能会利用coalesce函数和其他null处理逻辑来处理缺少的值。1如何知道哪些列增加了,2如何确定哪些行应使用增加的值进行更新?这是问题的症结所在,我需要能够将每列的现有值与建议值进行比较,并取最高值。甚至所有者主键也可以是-1吗?不