【问题标题】:SQL Update for cases案例的 SQL 更新
【发布时间】:2021-11-10 04:36:20
【问题描述】:

我在加入两个表后尝试更新列。如果一列与另一列匹配,我想将另一列更改为“W”,如果它已经为空白/NULL,我想保留它,否则我想将其更改为“L”。这是我所拥有的:

UPDATE user_games 
LEFT JOIN games ON user_games.game_key = games.game_id 
SET user_games.result = CASE 
                            WHEN user_games.pick = games.winner then 'W';
                            WHEN games.winner = NULL then NULL;
                            ELSE 'L';
                        END;

我收到此错误:#1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在第 4 行的 '' 附近使用正确的语法

我使用的是服务器版本:10.4.20-MariaDB

【问题讨论】:

  • 样本数据和期望的结果会很有帮助。

标签: sql mariadb sql-update inner-join mariadb-10.4


【解决方案1】:

试试这个:你必须为L 写一个特定的条件,因为在 ELSE 中它可以在许多条件下更新。另外,使用IS NULL 代替= NULL 来检查列中的NULL 值。

UPDATE user_games 
LEFT JOIN games ON user_games.game_key = games.game_id 
SET user_games.result = 
            CASE 
                WHEN user_games.pick = games.winner THEN 'W'
                WHEN games.winner IS NOT NULL AND user_games.pick <> games.winner THEN 'L'
                ELSE NULL
            END;

【讨论】:

    【解决方案2】:

    下面的查询能解决你的问题吗?

    update  a
    set a.result = 
    CASE 
        WHEN a.pick = b.winner then 'W'
        WHEN b.winner = NULL then NULL
        ELSE 'L'
    END
    from user_games  a
    LEFT JOIN games b ON a.game_key = b.game_id 
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    ; 用于表示查询的结束,不应在两者之间使用。
    也始终使用ISnull 进行比较,而不是=

    SET user_games.result = 
                      CASE WHEN games.winner IS NULL OR games.winner = '' then NULL
                           WHEN user_games.pick = games.winner then 'W' 
                           ELSE 'L'
                      END;
    

    【讨论】:

    • 谢谢!它正在工作一半;但是,当 games.winner 为 NULL 时,我仍然看到 user_games.pick 列更新为“L”。它是空的,它会是 '' 而不是 NULL?
    • 非常感谢@juergend!!!它现在工作得很好。列是 '' 而不是 NULL。非常感谢!
    • @juergend 我不知道为什么您的解决方案得分为负。您首先回复并使用解决问题的详细信息更新了您的回复。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多