SQL:4个条件与OR组合

SQL:4个条件与OR组合,sql,postgresql,Sql,Postgresql,问题是, 确定符合以下列表中至少四个标准组合的船舶表中所有船舶的名称:numGuns=8孔径=15排水量=32000类型=bb下水=1915等级=Kongo国家=美国 我找到了这个练习的答案 答案是, SELECT s.name from ship s,classes c WHERE s.class=c.class AND ((numGuns = 8 AND bore = 15 AND displacement = 32000 AND type = 'bb') OR

问题是,

确定符合以下列表中至少四个标准组合的船舶表中所有船舶的名称:numGuns=8孔径=15排水量=32000类型=bb下水=1915等级=Kongo国家=美国

我找到了这个练习的答案

答案是,

SELECT s.name from ship s,classes c 
WHERE s.class=c.class AND 
    ((numGuns = 8 AND bore = 15 AND displacement = 32000 AND type = 'bb') 
        OR (numGuns = 8 AND bore = 15 AND displacement = 32000 AND launched = 1915) 
        OR (numGuns = 8 AND bore = 15 AND displacement = 32000 AND c.class = 'Kongo') 
        OR (numGuns = 8 AND bore = 15 AND displacement = 32000 AND country = 'USA') 
        OR (numGuns = 8 AND bore = 15 AND type = 'bb' AND launched = 1915) 
        OR (numGuns = 8 AND bore = 15 AND type = 'bb' AND c.class = 'kongo')  
        OR (numGuns = 8 AND bore = 15 AND type = 'bb' AND country = 'USA')  
        OR (numGuns = 8 AND bore = 15 AND launched = 1915 AND c.class = 'Kongo')  
        OR (numGuns = 8 AND bore = 15 AND launched = 1915 AND country = 'USA')  
        OR (numGuns = 8 AND bore = 15 AND c.class = 'Kongo' AND country = 'USA')  
        OR (numGuns = 8 AND displacement = 32000 AND type = 'bb' AND launched = 1915)  
        OR (numGuns = 8 AND displacement = 32000 AND type = 'bb' AND c.class = 'kongo')  
        OR (numGuns = 8 AND displacement = 32000 AND type = 'bb' AND country = 'USA')  
        OR (numGuns = 8 AND displacement = 32000 AND launched = 1915 AND c.class = 'Kongo')  
        OR (numGuns = 8 AND displacement = 32000 AND launched = 1915 AND country = 'USA') O
我的问题是,


是否有其他简单的方法来检查条件。

严格地从谓词的角度来看,是的,例如最后5个谓词:

OR (numGuns = 8 AND displacement = 32000 AND type = 'bb' AND launched = 1915)  
OR (numGuns = 8 AND displacement = 32000 AND type = 'bb' AND c.class = 'kongo')  
OR (numGuns = 8 AND displacement = 32000 AND type = 'bb' AND country = 'USA')  
OR (numGuns = 8 AND displacement = 32000 AND launched = 1915 AND c.class = 'Kongo')  
OR (numGuns = 8 AND displacement = 32000 AND launched = 1915 AND country = 'USA')
可以是:

OR ((numGuns = 8 AND displacement = 32000) AND 
    ((type = 'bb' AND launched = 1915) OR 
    (type = 'bb' AND c.class = 'kongo') OR 
    (type = 'bb' AND country = 'USA') OR 
    (launched = 1915 AND c.class = 'Kongo') OR 
    (launched = 1915 AND country = 'USA')))

您可以使用
CASE-WHEN
语句统计每个记录的匹配列数,然后包装此查询以仅获取具有4个或更多匹配列的记录

SELECT t.name
FROM
(
    SELECT s.name,
        CASE WHEN s.numGuns = 8 THEN 1 ELSE 0 END AS c1,
        CASE WHEN s.dbore = 15 THEN 1 ELSE 0 END AS c2,
        CASE WHEN s.displacement = 32000 THEN 1 ELSE 0 END AS c3,
        CASE WHEN s.type = 'bb' THEN 1 ELSE 0 END AS c4,
        CASE WHEN s.launched = 1915 THEN 1 ELSE 0 END AS c5,
        CASE WHEN c.class = 'Kongo' THEN 1 ELSE 0 END AS c6,
        CASE WHEN s.country = 'USA' THEN 1 ELSE 0 END AS c7
    FROM ship s INNER JOIN classes c ON s.class = c.class
) t
WHERE (t.c1 + t.c2 + t.c3 + t.c4 + t.c5 + t.c6 + t.c7) >= 4

boolean
integer
的转换产生0或1:

select s.name
from
    ship s
    inner join
    classes c using (class)
where
    (numguns = 8)::int +
    (bore = 15)::int +
    (displacement = 32000)::int +
    (type = 'bb')::int + 
    (launched = 1915)::int + 
    (class = 'Kongo')::int +
    (country = 'USA')::int
    >= 4

请给出有意义的标题。是的,只需围绕
WHERE
子句移动以简化它们。@Ruslan这意味着什么?为什么不将所有这些子句放到另一个表中,然后找到两个表之间的交点?嗨@suresh,我是Ed Heal。sql查询中的条件太多。在练习中,它可能会起作用,但如果您将该查询放入工作环境中,您的查询肯定会被拒绝。。。