ISNULL 打印 *
ISNULL prints *
我在使用 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)
你可以使用 COALESCE
:
SELECT COALESCE(left(cast(null as varchar),1),-1);
ISNULL
从第一个参数推断数据类型,COALESCE
从更宽的参数推断(Data type precedence)
出现星号的原因是溢出错误。 left(cast(null as varchar),1)
会 return 一个 varchar(1)
。在 ISNULL
中,值 -1
将隐式转换为 varchar(1)
,负数不能用单个字符表示,因此显示 '*'
。
如果将其更改为 LEFT(...2)
,则得到结果:
SELECT ISNULL(LEFT(CAST(NULL AS varchar),2),-1);
我在使用 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)
你可以使用 COALESCE
:
SELECT COALESCE(left(cast(null as varchar),1),-1);
ISNULL
从第一个参数推断数据类型,COALESCE
从更宽的参数推断(Data type precedence)
出现星号的原因是溢出错误。 left(cast(null as varchar),1)
会 return 一个 varchar(1)
。在 ISNULL
中,值 -1
将隐式转换为 varchar(1)
,负数不能用单个字符表示,因此显示 '*'
。
如果将其更改为 LEFT(...2)
,则得到结果:
SELECT ISNULL(LEFT(CAST(NULL AS varchar),2),-1);