Oracle 中的案例语句显示所有内容而不是查询项

Posted

技术标签:

【中文标题】Oracle 中的案例语句显示所有内容而不是查询项【英文标题】:Case statement in Oracle showing everything instead of queried items 【发布时间】:2018-05-03 22:02:55 【问题描述】:

我正在为班级创建一个电影数据库,我必须创建一个查询,它将获取电影的标题和发行日期,并在电影标题包含指定城市或有与该电影相关的演员/女演员在该城市出生或死亡。当我必须添加第三列时,问题就来了,说明电影对给定城市的影响(标题包含它,演员与城市相关等)。我得到了以前的帮助,告诉我使用 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 语句,它只会 SELECT DISTINCT 所有标题。有什么方法可以解决这个问题并显示应该的结果吗?示例:

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

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

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

【问题讨论】:

您能提供一些示例数据并期待结果吗? “但这只会显示所有电影标题”,难怪你在外部查询中没有 WHERE 子句。 @stickybit - 请考虑将其作为答案,以便对其进行投票。 @BobJarvis:完成。 我编辑了问题以显示另一个预期结果,以及我对 WHERE 子句的了解。我只是不知道在里面写什么 【参考方案1】:

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

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

【讨论】:

谢谢!但是我应该在 WHERE 中写什么?我只是想让他们显示 REASON 列是否为空。 @EnriqueTorres:嗯,在你的情况下,你需要处理三个条件。我假设您想要所有这些条件都成立的电影?因此,您可以做的最简单的事情是尝试在 WHEREOR 运算符中使用它们。

以上是关于Oracle 中的案例语句显示所有内容而不是查询项的主要内容,如果未能解决你的问题,请参考以下文章

在ORACLE如何查看自己建立的所有表,而不是系统表

Oracle Apex - where 语句中的案例

在 Oracle 更新语句中使用子查询而不是表名

如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果

oracle单行函数 之 通用函数

oracle apex 只刷新一个区域而不是整个页面