表和数据:
表A:create table A (id int,c1 nvarchar(10),c2 varchar(10),flag char(1));
表B:create table B (id int,c1 nvarchar(10),c2 varchar(10),des varchar(20));
insert into A values (1, '张', '201', '0');
insert into A values (1, '王', '202', '0');
insert into A values (1, '李', '203', '0');
insert into B (id, c1, c2, des) values (1, '张', '201', '测试1');
insert into B (id, c1, c2, des) values (1, '王', '202', '测试2');
insert into B (id, c1, c2, des) values (1, '李', '203', '测试3');
关联关系:
A表的c1、c2字段和B表的c1,、c2字段分别为外键关联。A表的c1、c2字段有且可能只有一个为null,当c1为null时,A表使用c2去关联B表c2,当c2为null时,A表使用c1关联B表的c1,都不为空时,两个条件都要关联。
实现SQL:
select *
from A a
left join B b
on nvl(a.c1,N'null') = (CASE nvl(a.c1,N'null')
WHEN N'null' THEN
N'null'
ELSE
b.c1
end)
and nvl(a.c2,'null') = (CASE nvl(a.c2,'null')
WHEN 'null' THEN
'null'
ELSE
b.c2
end);
注意点:1、当字段值为null时,自己和自己比较结果为不相等。这时,可将空值通过nvl函数转换为其它值(本例中'null'),再做比较。
2、当字段是nvarchar类型时,需要在字符前面加大写的N。
N 在这里表示 Unicode,就是双字节字符。对于西文字符,用一个字节来存储过足够了,对于东方文字字符,
就需要两个字节来存储。Unicode 为了统一、规范、方便、兼容,就规定西文字符也用两个字节来存储。
也就是说加 N 就表示字符串用 Unicode 方式存储.
对于nvarchar是否需要+N,会自动转换的情况不需要,但是如上例case语句中,不能自动转换,则需要手动+N