内部联接空值

21 mysql sql t-sql sqlite

我不确定我是否在逻辑上犯了错误.

如果我有一个查询,我做一个空值的内连接,我总是得不到结果,还是会忽略连接并成功?例

user { id PK, name NVARCHAR NOT NULL, banStatus nullable reference }
Run Code Online (Sandbox Code Playgroud)

如果我写和u.banStatus我将不会收到任何行?

select * from user as u
join banstatus as b on u.banStatus=b.id
where id=1
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 49

如果连接为null,则不会获取该行,因为NULL不能等于任何内容,甚至是NULL.

如果将其更改为LEFT JOIN,那么您将获得该行.

使用内部联接:

select * from user as u
join banstatus as b on u.banStatus=b.id

1, '1', 1, 'Banned'
Run Code Online (Sandbox Code Playgroud)

使用左连接:

select * from user as u
left join banstatus as b on u.banStatus=b.id

1, '1', 1, 'Banned'
2, 'NULL', , ''
Run Code Online (Sandbox Code Playgroud)

使用此测试数据:

CREATE TABLE user (id int, banstatus nvarchar(100));
INSERT INTO user (id, banstatus) VALUES
(1, '1'),
(2, 'NULL');

CREATE TABLE banstatus (id int, text nvarchar(100));
INSERT INTO banstatus (id, text) VALUES
(1, 'Banned');
Run Code Online (Sandbox Code Playgroud)

  • 我不需要测试数据或其他任何其他构造(是的,你不会得到行),但对未来的读者有好处.+ 1&接受. (2认同)

Dan*_*llo 8

当你这样做时INNER JOIN,NULL值与任何东西都不匹配.甚至没有彼此.这就是为什么您的查询不返回任何行.(来源)


Vad*_* K. 7

这是null的内部连接(Oracle语法):

select *
  from user
       uu
  join banstatus
       bb
    on uu.banstatus = bb.id
       or
       uu.banstatus is null and bb.id is null
Run Code Online (Sandbox Code Playgroud)