SQL 处理空值时的多个连接

SQL multiple joins while dealing with null values

我对 SQL 语法以及如何完成查询有疑问。

我使用两个查询和一些 PHP 解决了我的问题。 但是,让我介绍一下我的数据库和问题。

Table structure

使用打印的唯一 ID table 我希望能够得到:

  1. 印刷品中的 dex 编号
  2. 图像(URL)来自印刷品
  3. 来自稀有的稀有
  4. 当不为 null 时从类型 x3 键入,否则我仍然想执行
  5. 来自 pokemon x5 的名称不为 null 否则我仍然想执行

收集所有值的查询非常简单

SELECT pr.dex, 
       pr.image, 
       p.name, 
       r.rarity, 
       t.type, 
       t2.type, 
       t3.type,
       p1.name,
       p2.name,
       p3.name,
       p4.name
FROM prints pr
       JOIN pokemons p ON p.dex=pr.dex
       JOIN rarities r ON r.id=pr.rarity
       JOIN types t ON t.id=p.type
       JOIN types t2 ON t2.id=pr.weakness
       JOIN types t3 ON t3.id=pr.resistance
       JOIN pokemons p1 ON p1.dex=p.evolveto
       JOIN pokemons p2 ON p2.dex=p.evolveto2
       JOIN pokemons p3 ON p3.dex=p.evolveto3
       JOIN pokemons p4 ON p4.dex=p.evolvefrom
WHERE pr.id=2;

但对于某些 pr.id(s)pr.weaknesspr.resistancep.evolvetop.evolveto2p.evolveto3 或 [=18= 的值] 可以而且应该为空。

当其中任何一个为空时,查询返回为空。

所以基本上我想要的是排除空值。

我尝试用 COALESCE() 包裹一些选择并用 CASE 玩了一下但没有成功。如果不管 pr.id 有什么值,只用一个查询就可以完成,那就太棒了。

您的 INNER JOIN 具有 ON 子句,这些子句在可能为 NULL 的字段上进行等值连接。 然而你还是想重新吵架, 显示给定字段为空。

您正在寻找的工具是 LEFT OUTER JOIN, 这将完全做到这一点。 https://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join

例如

SELECT cat.name, cat.price, inv.qty, inv.date
FROM catalog cat
LEFT OUTER JOIN inventory inv  ON cat.id = inv.cat_id

将显示目录项,即使它们尚未清点。

COALESCE(inv.qty, 0)这样的表达 可以方便地抑制 NULL 如果需要,在结果行中。