我正在使用 MS SQL SERVER 2008R2 。我有两张表A和B
create table A(
id int primary key, name Varchar(20));
create table B(
id int primary key, user_name Varchar(20));
insert into A values(1,'A1');
insert into A values(2,'A2');
insert into A values(3,'A3');
insert into A values(4,'A4');
insert into A values(5,'A5');
现在我的问题是:
select A.*
from A left outer join B on A.id = B.id
where B.user_name like '%';
或
select A.*
from A left outer join B on A.id = B.id
where B.user_name like '%%';
以上书面查询不会返回任何记录,即使左表中有5个条目。在右表上没有任何过滤器,它可以正常工作。
答案 0 :(得分:4)
select A.* from A left outer join B on A.id = B.id
这个查询会让你像这样......
id name id user_name
1 A1 NULL NULL
2 A2 NULL NULL
3 A3 NULL NULL
4 A4 NULL NULL
5 A5 NULL NULL
您正在使用与 null
相似的用户名进行比较select A.* from A left outer join B on A.id = B.id where B.user_name like '%%';
因此它不会给你任何输出
您应该尝试以下查询
<强> select A.*,b.* from A left outer join B on A.id = B.id where (b.user_name like '%%' or b.user_name is null)
强>
答案 1 :(得分:3)
在你的场景中...第一个左连接正在发生它正在找到5个条目,然后在该记录集上sql sever正在应用user_name的过滤器,并且所有行的user_name都是null ..没有记录显示。
您可以将查询更改为
select A.* from A left outer join B on A.id = B.id where ISNULL(B.user_name,'') like '%%';
答案 2 :(得分:3)
您正在使用通配符来比较空值, 使用此,
.logo h1 {
text-indent: -99999px;
}
答案 3 :(得分:2)
由于表B中的所有值均为NULL
,因此NULL
值上的任何通配符匹配都将返回NULL
。
因此条件where B.user_name like '%';
转换为where NULL like '%';
,其值为NULL,因为NULL无法与任何值进行比较。
select A.* from A left outer join B on
A.id = B.id where COALESCE(B.user_name,'') like '%%';
select A.* from A left outer join B on
A.id = B.id where COALESCE(B.user_name,'') like '%';
支持sql小提琴:http://sqlfiddle.com/#!6/1ca91/8
请注意COALESCE
是ANSI,因此在Oracle,SQL Server和PostGres中受支持,并进行快捷方式评估。 Ñ
编辑:根据新信息,此相同查询应适用于所有SQL Server,PostGres和Oracle。我正在将SQL查询更改为 使用
支持COALESCE
而不是所有除非您使用
ISNULL()
并按此检查where ISNULL(B.user_name,'') like '%';
select A.* from A left outer join B on A.id = B.id where ISNULL(B.user_name,'') like '%%'; select A.* from A left outer join B on A.id = B.id where ISNULL(B.user_name,'') like '%';
看到这个小提琴 http://sqlfiddle.com/#!6/1ca91/6
答案 4 :(得分:0)
请尝试这个:
select A.* from A
left outer join (SELECT * FROM B where user_name like '%') X on A.id = X.id;