我有表A,表B,两张表都有column1字段(这个字段是两个表的关联字段),我需要的sql语句是:表A的column1字段不为空时,增加条件A.column1=B.column1;为空时,不加条件。这样的sql怎么写?

解决方案 »

  1.   

    我用case语句如下:
    and A.column1 =(CASE A.column1 WHEN  null THEN null ELSE B.column1  end)但是对null的判断是is null,求解
      

  2.   


    你是说用sql判断,还是java语句判断
      

  3.   

    select xx
    from A
    left join B on A.column1=B.column1
      

  4.   

    SQL左连接可以实现,select * from A left join B on A.column1=B.column1
      

  5.   

    如果有两个条件呢,
    如果column1 为null,则用A.column2=B.column2
      

  6.   

     楼主 :就是左外连接呀
           假如有两个数据表A(或连接)和B(或连接),并且需要某个共同存在的数据项c相等,而且在A中出现的记录全 部被筛选出,B中没有的记录则用空格填写,这种运算记为A.c*=B.c,称为左外联结。这两个的效果是一样的:
        select *  from a, b where  
                     a.column1=(CASE a.column1 WHEN  null THEN null ELSE b.column1 end)     
        select * from a left join b on b.column1=b.column1
           
          
      

  7.   


    and A.column1 =(CASE A.column1 WHEN null THEN A.column1 ELSE B.column1 end)是null的时候等于自己
      

  8.   

    TO andesen:
    oracle 值为null的时候,自己也不等于自己。
      

  9.   

    表和数据:
    表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