使用CASE语句更新SQL表的问题

时间:2014-08-06 22:56:01

标签: sql case

我对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 

我收到此错误:

  

Msg 245,Level 16,State 1,Line 1   转换varchar值时,转换失败'第一季度'数据类型int。

2 个答案:

答案 0 :(得分:1)

月定义为int,但您尝试更新表并将Month设置为varchar,如“First Quarter”。您可以更改Month以存储varchar,然后修改insert语句和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列。

答案 1 :(得分:0)

您的列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完成。最佳做法是使用计算列或具有VIEW列的单独Quarter INT。此代码将添加具有适当数据类型的计算列。

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