第一种情况: 为什么Case语句在这种情况下返回1作为输出。 首先,我查看了这个查询:
DECLARE @VAR INT=0
SELECT CASE
WHEN @VAR = ' ' THEN 1
ELSE 0
END as empty_string
输出:
empty_string
1
在这种情况后,我尝试这样: 第二种情况: 为什么在分配到Local varible时会出现不同的值?
DECLARE @var1 INT =' '
SELECT @var1 AS empty_assighn
SELECT ' ' AS empty_string
输出:
empty_assighn
0
empty_string
-----------
然后我发现无论何时分配它都需要' '(空字符串)为零值。这就是为什么我在第一种情况下得到1作为输出。但为什么这样呢?这背后的原因是什么?
提前致谢
答案 0 :(得分:3)
因为,查询下面会返回0
SELECT CAST(' ' AS INT)
执行此操作时,检查CASE WHEN @VAR = ' ' THEN 1
,条件的右侧将转换为变量的数据类型(INT
)。因此条件结果为True
。
答案 1 :(得分:0)
默认情况下,sqlserver会尝试按照我们定义的数据类型转换值(称为隐式转换)。 请查看此link,msdn link以获取更多理解。
如果您的值无法在内部转换,则会在将youardatatype值转换为数据类型int时将错误抛出为'转换失败。'
当我们使用强制转换或转换功能时,它被称为“明确转换'
”检查此示例:
This will convert without error
select cast('' as int)
select cast(' ' as int)
select cast(null as int)
select cast(cast( null as datetime) as int)
select cast( cast(0 as decimal) as int)
select cast( cast(1 as bit) as int)
select cast( cast(11 as bit) as int)
select cast( cast(0.0 as decimal) as int)
select cast( cast(0.1 as numeric(18,2)) as int)
This will throw error because it is not have int value
select cast('a' as int)
select cast(' , ' as int)
同样的事情适用于其他数据类型,如Datetime
--As datetime format in sqlserver is yyyy-mm-dd so, if we give this format in string it will convert
select cast('' as datetime)
select cast('20151211' as datetime) --today's date
select cast('2015-12-11' as datetime)
select cast('2015-12-11' as datetime)
select cast('12-11-2015' as datetime)
--this throw error
select cast('2015-24-11' as datetime)