在使用isnull时,我遇到了这种奇怪的行为(好吧也许并不奇怪,但超出了我的理解)。这一切都归结为:
isnull(left(cast(null as varchar),1),0)
提供0
isnull(left(cast(null as varchar),1),-1)
提供*
我想知道这种行为背后的原因。
虽然我在这里得到了一个解决方法:
select isnull(cast(left(cast(null as varchar),1) as varchar),-1)
答案 0 :(得分:4)
星号的原因是由于溢出错误。 left(cast(null as varchar),1)
会返回varchar(1)
。在ISNULL
中,值-1
将隐式转换为varchar(1)
,而负数不能用单个字符表示,因此显示'*'
的原因。< / p>
如果您将其更改为LEFT(...2)
,则会获得结果:
SELECT ISNULL(LEFT(CAST(NULL AS varchar),2),-1);
答案 1 :(得分:0)
您可以使用.
:
COALESCE
<强> DBFiddle Demo 强>
SELECT COALESCE(left(cast(null as varchar),1),-1);
从第一个参数推断出数据类型,ISNULL
推断出更广泛的参数Data type precedence