【问题标题】:Issues with updating a SQL table using a CASE statement使用 CASE 语句更新 SQL 表的问题
【发布时间】:2014-08-07 07:19:15
【问题描述】:

我对 SQL 还很陌生,但仍在尝试理解一些概念... 我创建了一个简单的表,我正在尝试使用 CASE 语句更新表中的一列。我理解为什么该声明不起作用,但我对如何解决它感到困惑....

这是我的代码:

CREATE TABLE q5
(
    UserID INT,
    Month INT,
    Score INT
)

INSERT INTO q5(UserID, Month, Score)
VALUES (1,1,10), (1,2,5), (1,1,6), (2,8,6), (3,1,9), (3,4,11), (3,6,9), (4,9,10), (5,1,2);


UPDATE q5 
SET 
Month = CASE WHEN Month IN (1, 2, 3) THEN 'First Quarter'
             WHEN Month IN (4, 5, 6) THEN 'Second Quarter'
             WHEN Month IN (7, 8, 9) THEN 'Third Quarter'
             ELSE 'Fourth Quarter'
END 

我收到此错误:

消息 245,第 16 级,状态 1,第 1 行 将 varchar 值“First Quarter”转换为数据类型 int 时转换失败。

【问题讨论】:

  • 您正在尝试将字符(“第一季度”等)存储在只能包含数字的字段(月列)中。它不起作用,您必须选择另一列。

标签: sql case


【解决方案1】:

Month 被定义为 int,但您正在尝试更新表并将 Month 设置为 varchar,例如“First Quarter”。您可以更改 Month 以存储 varchar,然后修改您的插入语句和 WHEN Month IN 片段,或者添加一个可以存储季度的附加列。

下面的查询显示了第二个选项(添加一个额外的列)。

CREATE TABLE q5
(
    UserID INT,
    Month INT,
    Score INT,
    Quarter varchar(20)
)

INSERT INTO q5(UserID, Month, Score)
VALUES (1,1,10), (1,2,5), (1,1,6), (2,8,6), (3,1,9), (3,4,11), (3,6,9), (4,9,10), (5,1,2);


UPDATE q5 
SET 
Quarter = CASE WHEN Month IN (1, 2, 3) THEN 'First Quarter'
             WHEN Month IN (4, 5, 6) THEN 'Second Quarter'
             WHEN Month IN (7, 8, 9) THEN 'Third Quarter'
             ELSE 'Fourth Quarter'
END 

根据使用方式,您最好添加一个可以计算季度的视图。这样,您就不必维护完全依赖于 Month 列的额外列。

【讨论】:

    【解决方案2】:

    您的列MONTH 只能存储INT 类型的数据。你现在得到的类似于下面的程序代码:

    int month = 2;
    
    if (month == 1 || month == 2 || month == 3)
    {
        month = "First Quarter"; // compiler error
    }
    

    如您所见,条件执行的那一行是相当荒谬的,因为月份的类型是 int

    您可能希望添加另一列,例如 Quarter

    ALTER TABLE q5 ADD Quarter NVARCHAR(100)
    
    UPDATE q5 
    SET 
    Quarter = CASE WHEN Month IN (1, 2, 3) THEN 'First Quarter'
                   WHEN Month IN (4, 5, 6) THEN 'Second Quarter'
                   WHEN Month IN (7, 8, 9) THEN 'Third Quarter'
                   ELSE 'Fourth Quarter'
              END
    

    虽然实际上,列出值名称应该由 UI 完成。最佳实践是使用计算列或单独的具有Quarter INT 列的VIEW。此代码将添加具有适当数据类型的计算列。

    ALTER TABLE q5 ADD
    Quarter AS CASE WHEN Month IN (1, 2, 3) THEN 1
                    WHEN Month IN (4, 5, 6) THEN 2
                    WHEN Month IN (7, 8, 9) THEN 3
                    ELSE 4
               END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 2023-03-08
      • 2011-08-28
      • 1970-01-01
      相关资源
      最近更新 更多