忽略select语句中的空值

时间:2014-03-21 13:04:32

标签: sql postgresql select join null

我试图通过我的computer_system检索组件列表,但是如果计算机系统的图形卡设置为null(即它有一个板载),则该行不会被返回通过我的选择声明。

我一直试图使用COALESCE而没有结果。我还在我的WHERE子句中尝试使用OR,然后只返回我的计算机系统和各种图形卡。

相关代码:

SELECT
computer_system.cs_id, 
computer_system.cs_name, 
motherboard.name, 
motherboard.price, 
cpu.name, 
cpu.price, 
gfx.name,
gfx.price
FROM 
public.computer_case , 
public.computer_system, 
public.cpu, 
public.gfx, 
public.motherboard, 
public.ram
WHERE 
computer_system.cs_ram = ram.ram_id AND
computer_system.cs_cpu = cpu.cpu_id AND
computer_system.cs_mb = motherboard.mb_id AND
computer_system.cs_case = computer_case.case_id AND 
computer_system.cs_gfx = gfx.gfx_id; <-- ( OR computer_system.cs_gfx IS NULL)

返回:

1;"Computer1";"Fractal Design"; 721.00; "MSI Z87"; 982.00; "Core i7 I7-4770K "; 2147.00; "Crucial Gamer"; 1253.00; "ASUS GTX780";3328.00

我应该使用联接吗?有没有简单的方法来表示返回请求的行,即使有一个血腥的NULL值。一直在努力奋斗至少2个小时。

如果需要,将发布表格。

编辑:它应该返回第二行:

2;"Computer2";"Fractal Design"; 721.00; "MSI Z87"; 982.00; "Core i7 I7-4770K "; 2147.00; "Crucial Gamer"; 1253.00; "null/nothing";null/nothing

2 个答案:

答案 0 :(得分:2)

您需要LEFT OUTER JOIN

首先,清理代码,以便使用ANSI连接,以便它可读:

SELECT
    computer_system.cs_id, 
    computer_system.cs_name, 
    motherboard.name, 
    motherboard.price, 
    cpu.name, 
    cpu.price, 
    gfx.name,
    gfx.price
FROM 
    public.computer_system
    INNER JOIN public.computer_case ON computer_system.cs_case = computer_case.case_id
    INNER JOIN public.cpu ON computer_system.cs_cpu = cpu.cpu_id
    INNER JOIN public.gfx ON computer_system.cs_gfx = gfx.gfx_id
    INNER JOIN public.motherboard ON computer_system.cs_mb = motherboard.mb_id
    INNER JOIN public.ram ON computer_system.cs_ram = ram.ram_id;

然后将INNER JOIN上的public.gfx更改为LEFT OUTER JOIN

    LEFT OUTER JOIN public.gfx ON computer_system.cs_gfx = gfx.gfx_id

请参阅PostgreSQL tutorial - joins

我强烈建议您阅读SQL的入门教程 - 至少是PostgreSQL教程,最好还有一些更多的材料。

答案 1 :(得分:1)

看起来它只是一个支架放置问题。将空检查和图形卡ID比较单独拉入一个子句。

...
computer_system.cs_case = computer_case.case_id AND 
(computer_system.cs_gfx IS NULL OR computer_system.cs_gfx = gfx.gfx_id)

此外,您询问是否应该使用连接。事实上,您通过在FROM子句中使用多个表并在WHERE子句中指定连接条件来使用连接。更改此选项以使用JOIN ON语法可能更容易阅读:

FROM sometable A
    JOIN someothertable B
        ON A.somefield = B.somefield
    JOIN somethirdtable C
        ON A.somefield = C.somefield
    etc

编辑:

您可能还希望将您希望null值的连接设置为左外连接:

SELECT * FROM
    first_table a
    LEFT OUTER JOIN second_table b
        ON a.someValue = b.someValue

如果连接中没有匹配项,则仍将返回左侧的行。