Sql server SQL Case语句会失败吗?

Sql server SQL Case语句会失败吗?,sql-server,case-statement,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。您也可以这样做: @N

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

您也可以这样做:

@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

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

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

例如,请参见。当
时,每个
都必须有一个
然后结果
,这是无法避免的。
THEN
未标记为可选。这同样适用于我使用过的所有其他RDBMS

下面是另一个例子:


您已经有了一个很好的替代方法,可以将其作为评论发布,因此我在此不再重复。

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

SQL:

输出: 铸造@stringVar:

铸造@intVar: 550


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

您可以使用
@MyValue-IN('1','2')
在一种情况下测试多个值。DECLARE@NewValue-int,@MyValue-varchar(50);设置@MyValue='111';设置@NewValue=NULL;如果ISNUMERIC(@MyValue)=1开始设置@NewValue=@MyValue结束;PRINT@MyValueMark:Your right我确实想知道Nate发布的内容,但我确实想知道是否有人会这样做。我没有将我的回答作为答案发布,因为尽管我怀疑SQL是否支持任何形式的“失败”或模仿它,但我也不确定这两种方式,我也不想查看它。我没有把它作为答案发布,因为我并没有真正回答他的问题。我认为只有t-sql(如SQLServer和sybase)使用@variable语法?但是你链接到mysql?OP应该提到他们正在使用的数据库,否则这里的每个人都只是在浪费时间猜测。像这样挑剔的东西通常是DBMS,现在也为SQL Server添加了链接。我很确定我的答案不是特定于T-SQL的,而是适用于大多数DB。我不能肯定这是否是全部——有很多RDBMS,但我想让一些人找到一个合理的主流RDBMS,这是一个反例
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