【问题标题】:Update Null value更新空值
【发布时间】:2012-05-25 22:23:55
【问题描述】:

This question 反映了我的问题。如何在 SQLite 中做到这一点?

我已经尝试UPDATE 使用自联接,在子查询、触发器和类似于this 的东西中隔离自联接。这是一个例子:

UPDATE stage 
SET title = 
(
  SELECT 
    prior.title
  FROM 
    stage prior,
    stage now
  WHERE 
    prior.rownum+1 = now.rownum
)
WHERE
title is null

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    我针对您提到的问题提出了一个解决方案(我在 SQL2008、SQLite3 和 Oracle11g 上测试成功)。我在下面复制了该解决方案:

    CREATE TABLE test(mysequence INT, mynumber INT);
    INSERT INTO test VALUES(1, 3);
    INSERT INTO test VALUES(2, NULL);
    INSERT INTO test VALUES(3, 5);
    INSERT INTO test VALUES(4, NULL);
    INSERT INTO test VALUES(5, NULL);
    INSERT INTO test VALUES(6, 2);
    SELECT t1.mysequence, t1.mynumber AS ORIGINAL
    , (
        SELECT t2.mynumber
        FROM test t2
        WHERE t2.mysequence = (
            SELECT MAX(t3.mysequence)
            FROM test t3
            WHERE t3.mysequence <= t1.mysequence
            AND mynumber IS NOT NULL
           )
    ) AS CALCULATED
    FROM test t1;
    
    -- below here it was only tested in SQLite3, but I believe it should
    -- work on other DBMS since it uses standard/non-proprietary SQL
    UPDATE test
    SET mynumber = (
        SELECT t2.mynumber
        FROM test t2
        WHERE t2.mysequence = (
            SELECT MAX(t3.mysequence)
            FROM test t3
            WHERE t3.mysequence <= test.mysequence
            AND mynumber IS NOT NULL
           )
    );
    

    【讨论】:

    • 谢谢 G。这将如何转化为 UPDATE 语句?
    • 非常好的 G。非常优雅,我已经检查了一个答案..但这一个也完美无缺。我希望我能选择两个答案!
    • 但我的只使用标准 SQL! :) 现在很严重:使用专有的 SQL 扩展没有问题,但是如果您计划将来迁移数据库提供程序,这可能是一个问题。
    【解决方案2】:

    SQLite 中的每个表都有一个名为 rowid 的伪列(可以通过几个不同的名称访问它:rowidoid_rowid_,除非这些名称被分配给其他,真实的,列)。 rowid 列本质上是唯一的行标识符,您可以将其用作排序标准和/或条件。

    以下查询演示了如何在 rowid 的帮助下解决您的问题:

    UPDATE stage
    SET title = (
      SELECT title
      FROM stage AS prev
      WHERE title IS NOT NULL AND prev.rowid < stage.rowid
      ORDER BY prev.rowid DESC
      LIMIT 1
    )
    WHERE title IS NULL
    

    这是demo on SQL Fiddle

    你可以在this SQLite manual阅读更多关于rowid的信息。

    【讨论】:

    • 谢谢安德烈。我在 Fiddle 上试过你的查询,是的,它确实有效。但是当我在我的数据库上尝试它时它没有。我尝试了三种方式:一次在 SQL Manager Firefox Add-in 中,一次在 Navicat(商业产品)中,一次在 sqlite3 命令行 shell 中。他们都没有更新表格。有什么想法吗?
    • 没有想法,抱歉。目前我对 SQLite 的了解还不够,很乐意自己知道答案并为您提供帮助。
    • 我没有你提到的任何产品,但我现在已经安装了 SQLite Manager Firefox 插件,看看我是否可以对我的解决方案做任何事情以使其至少在那里工作。你猜怎么着?我运行了所有命令:在更新之前创建表、插入值、检索行,然后使用与我的答案完全相同的语句更新表,并再次查看 SELECT * 的输出——它工作正常。由于我不是一个非常有经验的 SQLite 用户,因此我无法真正告诉您可能有什么不同。我安装的插件版本是0.7.7,火狐12.0。
    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2013-12-14
    • 2012-10-29
    • 2014-12-17
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多