关于外键可为null情况及case 语句中使用NVarchar类型的字段的处理

本文介绍了一种复杂的SQL关联查询方法,特别适用于处理包含NULL值的字段,并演示了如何通过nvl函数转换空值进行准确匹配。同时强调了nvarchar类型字段在SQL语句中的正确处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表和数据:

表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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值