SQL:当WHERE语句不为真时减少选择条件

时间:2015-07-15 15:21:12

标签: sql sql-server

也许不是最具描述性的主题,但问题是,虽然下面的查询完全符合我的要求,但我还想在Note.Name =' Travel Advisory&#39时返回记录;不是真的。 但是,当没有Note.Name等于' Travel Advisory'对于Note.Notes,我仍然希望返回选择值EXCEPT。

Note.Name列有各种值,例如'旅游咨询'一般信息'和'指南'。

SELECT Supplier.Name, Supplier.Changeoverday, Supplier.Code, Note.Notes
FROM Supplier
INNER JOIN Note
ON Supplier.ID=Note.LINKID
WHERE Supplier.TID = 315
AND
Supplier.SID = 2350
AND
Note.Name = 'Travel Advisory'

3 个答案:

答案 0 :(得分:3)

听起来你想要LEFT JOIN

SELECT Supplier.Name, Supplier.Changeoverday, Supplier.Code, Note.Notes
FROM Supplier
LEFT JOIN Note
    ON Supplier.ID=Note.LINKID
    AND Note.Name = 'Travel Advisory'
WHERE Supplier.TID = 315
AND
Supplier.SID = 2350

如果Note表中没有匹配的记录,则Notes将为null

答案 1 :(得分:0)

编辑:我没有注意到你从2个表中选择,我同意另一个海报回答的OUTER JOIN方法。我的方法是一种方便的方法来对抗1个表(如果你不使用表别名和OUTER JOIN,那就是......)

您可以使用案例来选择列并执行您想要的操作,只需从WHERE中删除该部分即可。我认为这种语法很好......

   SELECT 
    Supplier.Name
    , Supplier.Changeoverday
    , Supplier.Code
    , CASE WHEN Note.Notes = 'Travel Advisory' THEN Note.Notes ELSE 'Not Travel Advisory' END

    FROM Supplier
    INNER JOIN Note
    ON Supplier.ID=Note.LINKID
    WHERE Supplier.TID = 315
    AND
    Supplier.SID = 2350

答案 2 :(得分:0)

您可以使用LEFT JOIN在没有匹配时返回NULL,并使用SELECT CASE来确定在{{1}的情况下返回哪个Note.Notes值}}

Note.Name = 'Travel Advisory'

但是,如果要返回条件Note.Name ='Travel Advisory'为SELECT Supplier.Name, Supplier.Changeoverday, Supplier.Code, case when Note.Name = 'Travel Advisory' then '0' else Note.Notes END as Notes FROM Supplier LEFT JOIN Note ON Supplier.ID=Note.LINKID WHERE Supplier.TID = 315 AND Supplier.SID = 2350 的行,我还会删除同一列(TRUE, False or UNKNOWN)上的过滤器。< / p>