针对条件

时间:2015-07-07 17:23:15

标签: sql-server db2 where-clause

有一张表格TABLEONE,其中包含以下值:

COLA       COLB
----       ----
RED        LILY
RED        ROSE
RED        ORCHID
BLUE       LILY
PINK       LILY
PINK       ROSE 
PINK       ORCHID
PINK       LAVENDER

我必须加入一个条件:

SELECT ALL FROM TABLEONE WHERE
COLA != RED AND
COLB != (ROSE,ORCHID) WHEN COLA = PINK 
DB2 SQL中的

我尝试了各种可能的条件组合,如下所示。

如果我使用的话,我最终会以某种方式丢失VARIOUS值:

where (COLA != 'RED') AND
(COLB NOT IN ('ROSE','ORCHID') AND COLA = 'PINK')

如果我使用的话,我最终会包含COLB: 'ROSE','ORCHID'

where (COLA != 'RED') OR
(COLB NOT IN ('ROSE','ORCHID') AND COLA = 'PINK')

除了我的代码中的硬编码之外,您能否建议我可以采用其他任何方式来实现此目的,以避免COLB: 'ROSE','ORCHID' if COLA = 'PINK'

由于

2 个答案:

答案 0 :(得分:1)

您可以尝试几种不同的方式。只使用not可能最简单:

Select * 
from TableOne
where ColA <> 'Red'
and not (ColA = 'Pink' 
         and ColB in ('Rose','Orchid')
        )

您还可以使用or

实现此逻辑
Select * 
from TableOne
where ColA <> 'Red'
and (ColA <> 'Pink' 
     or ColB not in ('Rose','Orchid')
    )

编辑:这是SQLFiddle:http://sqlfiddle.com/#!6/4f018/1/0。它使用联合用于显示目的(向您显示两个查询返回相同的结果),但您应该只使用上述两个选项之一。

答案 1 :(得分:0)

IN运算符可以比较多列表达式,这可以简化用于描述高级过滤条件的SQL谓词:

WITH TableOne ( ColA, ColB ) AS ( 
   VALUES( 'RED', 'LILY' ),
    ( 'RED', 'ROSE' ),
    ( 'RED', 'ORCHID' ),
    ( 'BLUE', 'LILY' ),
    ( 'PINK', 'LILY' ),
    ( 'PINK', 'ROSE' ),
    ( 'PINK', 'ORCHID' ),
    ( 'PINK', 'LAVENDER' )
)
SELECT * FROM TableOne
WHERE ColA <> 'RED'
AND ( ColA, ColB ) NOT IN ( 
    VALUES( 'PINK', 'ROSE' ), ( 'PINK', 'ORCHID' )
);


COLA COLB
---- --------
BLUE LILY
PINK LILY
PINK LAVENDER

3 record(s) selected.