【问题标题】:Case statement errors with unneccessary conversion带有不必要转换的案例语句错误
【发布时间】:2014-10-24 13:21:36
【问题描述】:

我目前正在编写一个视图,如下所示,但我在最后五次选择时遇到了一些问题。我从一个主要是 int 值但包含一些 NULLS 的表中提取。我想要将这些“rep”列的任何 NULL 值输出为“N/A”,但是 case 语句中的一些逻辑在尝试将 N/A 转换为 INT 时抛出错误。

我认为在 case 语句中的某处,它将 NULLS 设置为 N/A,然后尝试将值添加到它作为 INT,但希望得到一些帮助,了解它可能在哪里崩溃。

非常感谢!

SELECT
--Name
ExerciseCultures.Name,
--Weight
CASE
  WHEN weight IS NULL THEN '0'
  ELSE
    CASE
      WHEN Type = 'Isolation' THEN
        CASE
          WHEN reps1 < '12'
               AND reps2 < '12'
               AND reps3 < '12' THEN weight
          ELSE
            CASE
              WHEN exercisecultures.name IN ( 'Hammer Curls', 'Concentration Curls' ) THEN workoutsessions.weight + ( 2.0 )
              ELSE WorkoutSessions.weight + ( 2.5 )
            END
        END
      ELSE
        CASE
          WHEN Type = 'Compound' THEN
            CASE
              WHEN name = 'Bench Press' THEN
                CASE
                  WHEN reps1 < '3'
                       AND reps2 < '3'
                       AND reps3 < '3' THEN weight
                  ELSE workoutsessions.weight + ( 2.5 )
                END
              ELSE
                CASE
                  WHEN reps1 < '5'
                       AND reps2 < '5'
                       AND reps3 < '5' THEN weight
                  ELSE workoutsessions.weight + ( 2.5 )
                END
            END
        END
    END
END AS Weight,
-- Reps1
CASE
  WHEN Reps1 = NULL THEN 'N/A'
  ELSE
    CASE
      WHEN Type = 'Isolation' THEN
        CASE
          WHEN reps1 < '12'
               AND reps1 >= '8' THEN reps1 + ( 1 )
          ELSE '8'
        END
      ELSE '5'
    END
END AS Reps1,
-- Reps2
CASE
  WHEN Reps2 IS NULL THEN 'N/A'
  ELSE
    CASE
      WHEN Type = 'Isolation' THEN
        CASE
          WHEN reps2 < '12'
               AND reps2 >= '8' THEN reps2 + ( 1 )
          ELSE '8'
        END
      ELSE '5'
    END
END AS Reps2,
--Reps3
CASE
  WHEN Reps3 IS NULL THEN 'N/A'
  ELSE
    CASE
      WHEN Type = 'Isolation' THEN
        CASE
          WHEN reps3 < '12'
               AND reps3 >= '8' THEN reps3 + ( 1 )
          ELSE '8'
        END
      ELSE '5'
    END
END AS Reps3,
--Reps4
CASE
  WHEN Reps4 IS NULL THEN 'N/A'
  ELSE
    CASE
      WHEN Type = 'Isolation' THEN
        CASE
          WHEN reps4 < '12'
               AND reps4 >= '8' THEN reps4 + ( 1 )
          ELSE '8'
        END
      ELSE '5'
    END
END AS Reps4,
--Reps5
CASE
  WHEN Reps5 IS NULL THEN 'N/A'
  ELSE
    CASE
      WHEN Type = 'Isolation' THEN
        CASE
          WHEN reps5 < '12'
               AND reps5 >= '8' THEN reps5 + ( 1 )
          ELSE '8'
        END
      ELSE '5'
    END
END AS Reps5
FROM   workoutsessions
       JOIN exercisecultures
         ON workoutsessions.ExerciseID = ExerciseCultures.ExerciseID
       JOIN workoutdates
         ON workoutsessions.WorkoutID = Workoutdates.WorkoutID
            AND workoutdates.date = (SELECT Max(date)
                                     FROM   WorkoutDates
                                     WHERE  workouttype = 'Pull') 

【问题讨论】:

  • 这正是问题所在,一列只能有一种类型。将所有值转换为 VARCHAR,因此您可以在同一列上包含“N/A”和“1”。示例:CONVERT(VARCHAR(20),reps1+(1))

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

在执行条件语句之前尝试将整数类型转换为 varchar 类型。您可以通过创建变量/临时表,将这些列指定为 VARCHAR 来执行此操作 - 然后从该临时表中提取数据,或者如果您不想这样做,则必须在查询中强制转换每个整数列,例如这……

    case when CAST(Reps1 AS varchar(100)) = Null then 'N/A'
    else

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多