ISNULL打印*

时间:2018-06-06 11:44:47

标签: sql-server isnull

在使用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)

2 个答案:

答案 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);

另请注意Bad habits to kick : declaring VARCHAR without (length)

答案 1 :(得分:0)

您可以使用.

COALESCE

<强> DBFiddle Demo

SELECT COALESCE(left(cast(null as varchar),1),-1); 从第一个参数推断出数据类型,ISNULL推断出更广泛的参数Data type precedence