有没有办法让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。
答案 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创建用户定义的函数。