我已经使用 CASE 语句解决了这个问题,但我想知道为什么在使用 时ISNULL
,我可以将一个值连接到 check_expression 而不是 replacement_value。这是一个例子:
create table name_test
(
nm varchar(25)
,mid_init varchar(1)
,name_type int
)
insert into name_test values('Joe',NULL,1)
insert into name_test values('Joe','X',2)
我有这个查询。
SELECT
n1.nm, isnull(n2.mid_init+'b',n1.mid_init) as m1,
isnull(n1.mid_init,n2.mid_init+'b') as m2
FROM
name_test n1
JOIN name_test n2
on n1.nm = n2.nm and n1.name_type = 1 and n2.name_type = 2
在第一个语句 ( m1
) 中,我首先使用 NOT-NULL 值,并与“b”连接。在第二个语句 ( m2
) 中,我首先使用 NULL 值,因此查询应该传递到 replacement_value。确实如此,但只取第一个值,而不是连接的值。
结果:
nm m1 m2
Joe Xb X
通过更多调查,我看到这个查询:
select
n1.nm, isnull(n2.mid_init+'b',n1.mid_init) as m1,
isnull(n1.mid_init,'1'+ n2.mid_init+'b') as m2
from
name_test n1
join name_test n2
on n1.nm = n2.nm and n1.name_type = 1 and n2.name_type = 2
返回
nm m1 m2
Joe Xb 1
因此,该ISNULL
函数将采用整个check_expression
,但如果check_expression
为空,它将只采用 的第一部分replacement_value
。
有谁知道为什么会有差异。另外,我用一个案例解决了它 - 有没有更好的解决方案?