SQL Case语句可以通过吗?

时间:2010-01-22 20:03:00

标签: sql-server case-statement

有没有办法让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。

3 个答案:

答案 0 :(得分:10)

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

例如,请参阅MySQL documentation for CASE。每个WHEN都必须有一个THEN result,而且无法解决这个问题。 THEN未标记为可选。这同样适用于我使用的所有其他RDBMS。

这是另一个例子:Sql Server's CASE expression

你已经有了一个很好的替代方式来发布评论,所以我不会在这里重复。

答案 1 :(得分:5)

你也可以这样做:

@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')也会更有意义。

答案 2 :(得分:0)

也可以使用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的try catch语句和返回整数的int default_value创建用户定义的函数。