Oracle中的Case语句显示了所有内容而不是查询的项目

时间:2018-05-03 22:02:55

标签: sql oracle case

我正在为一个电影数据库工作,我必须创建一个查询,它将获得标题和电影发布的日期,并在电影标题的时间和时间显示这些列包含指定的城市或有与该城市出生或死亡的电影相关的演员/女演员。问题来自于我必须添加第三列,说明关于电影对城市的实际情况的一些信息(标题包含它,演员与城市有关等)。我得到了以前的帮助,告诉我使用CASE语句(我使用的是Oracle),这就是我的归宿:

SELECT DISTINCT o.titulo, o.fecha_estreno,
CASE 
    WHEN UPPER(o.titulo) LIKE '%ZARAGOZA%' AND EXISTS(SELECT p.id_obra FROM Pelicula p WHERE p.id_obra = o.id_obra) THEN 'Titulo'
    WHEN EXISTS(SELECT DISTINCT pa.id_obra 
        FROM Participa pa
            WHERE pa.id_obra = id_obra AND EXISTS(SELECT DISTINCT l.nombre FROM Lugar l
                WHERE UPPER(l.nombre) LIKE '%ZARAGOZA%' AND EXISTS(SELECT DISTINCT tl.id_lugar FROM TieneLugar tl
                    WHERE tl.id_lugar = l.id_lugar AND tl.id_profesional = pa.id_profesional))) THEN 'Actor relacionado con lugar'
    WHEN EXISTS(SELECT DISTINCT er.id_obra 
        FROM EstaRelacionado er 
            WHERE er.id_obra = id_obra AND EXISTS(SELECT DISTINCT k.keyword 
            FROM Keywords k
                WHERE k.id_keyword = er.id_keyword AND UPPER(k.keyword) LIKE '%ZARAGOZA%')) THEN 'Keyword relacionada con pelicula'
    END AS Causa
FROM Obra o;

但这只会显示所有电影片名,即使它们根本不相关。我发现它只是不会进入任何WHEN声明,它只会选择DISTINCT所有标题。有没有办法解决这个问题并显示结果呢?例如:

  TITULO          FECHA_ESTRENO              CAUSE
----------       ----------------    ---------------------
Barcelona mia         1967             Title contains city
Lights out            1985             Actor is related to place

编辑:例如在熄灯时,有一个演员分配了一个事件(出生或死亡),其中包含搜索到的城市。

此查询应该只显示300个元素。它显示4400.我知道它与WHERE子句有关,但我尝试写WHERE原因IS NOT NULL;并且这不会起作为原因并不存在

1 个答案:

答案 0 :(得分:2)

查询显示所有电影,因为外部查询中没有WHERE子句。

WHERE子句是查询的一部分,它告诉数据库返回的行应该具有哪些属性。 (实际上WHERE是其中之一,其他人也可以产生这种效果,但这在现在和现在都无关紧要,你现在也不会使用其中之一)。如果省略WHERE子句,则返回表的所有行。