带有条件NULL列的MySQL SELECT

时间:2011-05-02 08:21:29

标签: mysql select

我是SQL编程的新手,并且遇到了一些麻烦。我有以下MySQL脚本:

SELECT
    MyPrimaryTable.PrimaryKey, Alias1.String AS Output1,
    CASE
        WHEN Id2 IS NOT NULL THEN Alias2.String
        ELSE ""
    END AS Output2
FROM MyPrimaryTable, MySecondaryTable AS Alias1, MySecondaryTable AS Alias2
WHERE
    MyPrimaryTable.Id1 = Alias1.Id1
    AND ((MyPrimaryTable.Id2 IS NULL) OR (MyPrimaryTable.Id2 = Alias2.Id2));

基本上,我有一个包含两个ID的主表,Id1和Id2,我试图将这些ID中的每一个与一个辅助表中的字符串相关联,并在SELECT结果中显示这些字符串。但是,主表中的第二个ID允许为NULL。在这种情况下,我想要的输出是预期的第一个字符串,第二个字符串为空(“”)。我编写的脚本执行此操作,除非为每个可能的字符串添加一个新行,即使所有行看起来都相同。

可能的字符串Foo1,Foo2,Foo3和Foo4的预期结果,表中有两个条目:

PK   Output1 Output2
1    Foo1    Foo4
2    Foo2

我得到了什么:

1    Foo1    Foo4
2    Foo2
2    Foo2
2    Foo2

如何清理它并使其按预期工作?感谢。

编辑:我希望不使用DISTINCT,因为我想在VIEW中使用它,而DISTINCT将使视图不可更新。

1 个答案:

答案 0 :(得分:1)

尝试使用

进行分组
GROUP BY MyPrimaryTable.PrimaryKey

另一方面,您可以加入表格而不是WHERE

SELECT
    MyPrimaryTable.PrimaryKey, 
    Alias1.String AS Output1,
    CASE
        WHEN Id2 IS NOT NULL THEN Alias2.String
        ELSE ""
    END AS Output2
FROM MyPrimaryTable, 
    LEFT JOIN MySecondaryTable AS Alias1 ON MyPrimaryTable.Id1 = Alias1.Id1
    LEFT JOIN MySecondaryTable AS Alias2 ON MyPrimaryTable.Id2 = Alias2.Id2