【问题标题】:Update multiple rows using a case statement only updates 1 row使用 case 语句更新多行仅更新 1 行
【发布时间】:2016-11-27 17:29:21
【问题描述】:

我想使用 case 语句更新一个表中的一列但多行。 这是更新声明:

UPDATE UDSDiagnosisGroups
SET UDSDiagnosisCategoryID = 
    CASE WHEN LineDisplay IN ('1-2', '3', '4', '4a', '4b') THEN (SELECT UDSDiagnosisCategoryID 
                                                                 FROM UDSDiagnosisCategories
                                                                 WHERE UDSDiagnosisCategory = 'Selected Infectious and Parasitic Diseases') 
         WHEN LineDisplay IN ('5', '6') THEN (SELECT UDSDiagnosisCategoryID 
                                              FROM UDSDiagnosisCategories
                                              WHERE UDSDiagnosisCategory = 'Selected Diseases of the Respiratory System')
         WHEN LineDisplay IN ('7', '8', '9', '10', '11', '12', '13', '14', '14a') THEN (SELECT UDSDiagnosisCategoryID 
                                                                                        FROM UDSDiagnosisCategories
                                                                                        WHERE UDSDiagnosisCategory = 'Selected Other Medical Conditions')
         WHEN LineDisplay IN ('15', '16', '17') THEN (SELECT UDSDiagnosisCategoryID 
                                                      FROM UDSDiagnosisCategories
                                                      WHERE UDSDiagnosisCategory = ' Selected Childhood Conditions (limited to ages 0 through 17)')
         WHEN LineDisplay IN ('18', '19', '19a', '20a', '20b', '20c', '20d') THEN (SELECT UDSDiagnosisCategoryID 
                                                                                   FROM UDSDiagnosisCategories
                                                                                   WHERE UDSDiagnosisCategory = 'Selected Mental Health and Substance Abuse Conditions')
    END                                           
FROM UDSDiagnosisGroups
WHERE UDSDiagnosisCategoryID IS NULL

问题是UDSDiagnosisGroups 表中只更新了 1 行。 更新的行是LineDisplay 值为1-2 的行。 所有其他值仍为 NULL

我哪里出错了?在我看来,我正在按照我找到的示例进行操作,但只更新了 1 行,而不是表中的所有行。

【问题讨论】:

  • 对我来说是正确的。要查看为什么没有匹配,只需选择 case 语句,即 I.E.删除 UPDATE UDSDiagnosisGroups SET UDSDiagnosisCategoryID = 并将其替换为 SELECT。然后在最后放置一个 ELSE LineDisplay,当你没有得到匹配时,你会看到 LineDisplay 的值是什么。
  • 好的。当我按照您的建议进行操作时,我收到有关数据类型的错误。 LineDisplay 是 varchar(5),ID 是 int。但我需要将 ID 基于 LineDisplay 值。因此,当 LineDisplay 是这个值列表时,根据 select 语句选择 ID。
  • 我想通了。 LineDisplay 字符串的开头有一个空的 varchar。当我修剪这些字符时,更新有效。感谢@Robert Bain 的建议。
  • @RobertBain - 根据您的建议创建一个答案,我会检查我的问题是否已回答。
  • 我已将我的建议添加为答案。

标签: sql sql-server case


【解决方案1】:

我建议你把你的代码改成这样,这样会更易读

UPDATE UDSDiagnosisGroups SET
    UDSDiagnosisCategoryID = d.UDSDiagnosisCategoryID 
from UDSDiagnosisGroups as g
    inner join UDSDiagnosisCategories as d on
        d.UDSDiagnosisCategory =
            case
                when g.LineDisplay in ('1-2', '3', '4', '4a', '4b') then
                    'Selected Infectious and Parasitic Diseases' 
                when g.LineDisplay in ('5', '6') then
                    'Selected Diseases of the Respiratory System'
                when g.LineDisplay in ('7', '8', '9', '10', '11', '12', '13', '14', '14a') then
                    'Selected Other Medical Conditions'
                when g.LineDisplay in ('15', '16', '17') then
                    ' Selected Childhood Conditions (limited to ages 0 through 17)'
                when g.LineDisplay in ('18', '19', '19a', '20a', '20b', '20c', '20d') then
                    'Selected Mental Health and Substance Abuse Conditions'
where
    g.UDSDiagnosisCategoryID is null

然后你可以玩select而不是update,看看UDSDiagnosisCategories返回的行是否有效。你可能有一些错别字。没有数据很难说得更多。

【讨论】:

    【解决方案2】:

    可能是您的列值为空而不是 Null。使用 ISNULL 并重试

    UPDATE UDSDiagnosisGroups
    SET UDSDiagnosisCategoryID = 
        CASE WHEN LineDisplay IN ('1-2', '3', '4', '4a', '4b') THEN (SELECT UDSDiagnosisCategoryID 
                                                                     FROM UDSDiagnosisCategories
                                                                     WHERE UDSDiagnosisCategory = 'Selected Infectious and Parasitic Diseases') 
             WHEN LineDisplay IN ('5', '6') THEN (SELECT UDSDiagnosisCategoryID 
                                                  FROM UDSDiagnosisCategories
                                                  WHERE UDSDiagnosisCategory = 'Selected Diseases of the Respiratory System')
             WHEN LineDisplay IN ('7', '8', '9', '10', '11', '12', '13', '14', '14a') THEN (SELECT UDSDiagnosisCategoryID 
                                                                                            FROM UDSDiagnosisCategories
                                                                                            WHERE UDSDiagnosisCategory = 'Selected Other Medical Conditions')
             WHEN LineDisplay IN ('15', '16', '17') THEN (SELECT UDSDiagnosisCategoryID 
                                                          FROM UDSDiagnosisCategories
                                                          WHERE UDSDiagnosisCategory = ' Selected Childhood Conditions (limited to ages 0 through 17)')
             WHEN LineDisplay IN ('18', '19', '19a', '20a', '20b', '20c', '20d') THEN (SELECT UDSDiagnosisCategoryID 
                                                                                       FROM UDSDiagnosisCategories
                                                                                       WHERE UDSDiagnosisCategory = 'Selected Mental Health and Substance Abuse Conditions')
        END                                           
    FROM UDSDiagnosisGroups
    WHERE ISNULL(UDSDiagnosisCategoryID,'') = ''
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多