当Where子句中的一个字段具有空值时,如何在Where子句中使用OR?

时间:2014-05-22 11:13:50

标签: python sql postgresql

我试图简单地查询数据,

select * from product where (color='blue' or type='suv')

我想要查询中提到的任何具有“颜色”和“类型”的特定数据,但如果我没有提及他“类型”那么它将仅从“颜色”获取数据。

例如:

product    color   type 
toyota      red     suv
honda       black   

select * from product where (color='blue' or type Is null)

在第二次查询中,它返回“丰田”和“本田”。

我需要的是获得产品,如果我给它的“颜色”值然后它只返回数据的颜色,如果我给它的“颜色”和“类型”值然后根据这两个值返回数据?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,如果同时填写了$1$2,那么您希望将它们视为or。如果只有一个,那么你只需要那个。

这应该实现这个逻辑:

where (color = $1 and $1 <> '') or (type = $2 and $2 <> '')

但是,如果您的表很大,我建议您将最简单的where子句放在一起。因此,使用python逻辑构造其中一个:

where color = $1
where type = $2
where color = $1 or type = $2

前两个(至少)可以利用适当的索引。

答案 1 :(得分:0)

要么...... 返回与该颜色和类型匹配的任何内容,或者如果没有类型传递给查询,则匹配颜色的所有内容

select * from product where color=$1 and (type=$2 or $2='')

或... 会返回与颜色和类型匹配的内容以及未指定类型的产品

select * from product where color='blue' and (type='suv' or type is null)

......这取决于你想要回来的东西。

如果传入或不传入颜色和类型,并且您想在查询中使用,那么:

select * from product where (color=$1 or $1='') and (type=$2 or $2='')