Sql server SQL Case语句会失败吗?
有没有办法让SQL中的CASE语句像C#中的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
@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