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

DBFiddle Demo

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

换个说法Bad habits to kick : declaring VARCHAR without (length)