有一张表格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'
?
由于
答案 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.