1

我已经使用 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

有谁知道为什么会有差异。另外,我用一个案例解决了它 - 有没有更好的解决方案?

4

1 回答 1

4

ISNULL继承第一个表达式COALESCE的数据类型,而根据数据类型优先级继承数据类型。(到底有什么意义varchar(1)?)

我会做:

select n1.nm, 
COALESCE(CONVERT(VARCHAR(25), 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;
于 2012-09-25T17:57:01.370 回答