15

有没有办法让 SQL 中的 CASE 语句像 C# 中的 case 语句一样失败?我不想做的是下面的例子,但如果这是我唯一的选择,我想我会去的。

例子:

@NewValue =
   CASE
      WHEN @MyValue = '1' THEN CAST(@MyValue AS int)
      WHEN @MyValue = '2' THEN CAST(@MyValue AS int)
      ELSE NULL
   END

编辑:

我正在使用 SQL Server。

4

3 回答 3

15

回答您的具体问题:不,它不能。

例如,参见CASE 的 MySQL 文档。每个人都WHEN必须有一个THEN result,并且没有办法解决这个问题。未THEN标记为可选。这同样适用于我使用过的所有其他 RDBMS。

这是另一个示例:Sql Server 的 CASE 表达式

您已经有一个很好的替代方法可以将其作为评论发布,所以我不会在这里重复。

于 2010-01-22T20:12:30.017 回答
4

你也可以这样做:

@NewValue =
   CASE
      WHEN @MyValue in ( '1', '2' ) THEN CAST(@MyValue AS int)
      ELSE NULL
   END

或像这样:

CASE @MyValue 
         WHEN '1' THEN CAST(@MyValue AS int)
         WHEN '2' THEN CAST(@MyValue AS int)
         ELSE null
      END

即使在这种情况下@MyValue in ('1','2')会更有意义。

于 2010-01-22T20:10:51.597 回答
-1

也可以使用 T-SQL try-catch。但是,我不确定这会对服务器产生什么样的负面影响:

SQL:

DECLARE @intVar VARCHAR(MAX), @stringVar VARCHAR(MAX), @default_value INT, @tempVar INT
SET @default_value = NULL
SET @stringVar = 'Hello World!!'
SET @intVar = '550'

PRINT 'Casting @stringVar: '
BEGIN TRY
    SET @tempVar = CAST(@stringVar AS INT)
END TRY
BEGIN CATCH
    SET @tempVar = @default_value
END CATCH
PRINT @tempVar + 20

PRINT ''

PRINT 'Casting @intVar: '
BEGIN TRY
    SET @tempVar = CAST(@intVar AS INT)
END TRY
BEGIN CATCH
    SET @tempVar = @default_value
END CATCH
PRINT @tempVar

输出: 铸造@stringVar:

铸造@intVar:550

此外,我将为那些接受 varchar inputString 和 int default_value 的 try catch 语句创建用户定义的函数,它返回整数。

于 2010-01-22T20:22:20.537 回答