每次使用不同的值写一个额外的列来查询结果

时间:2018-05-03 07:22:52

标签: sql oracle

我现在已经搜索了很长一段时间,但我还没能找到我正在寻找的答案。我有以下查询:

SELECT DISTINCT o.titulo, o.fecha_estreno
FROM Obra o 
WHERE (o.titulo LIKE '%Barcelona%' AND EXISTS(SELECT p.id_obra FROM Pelicula p WHERE p.id_obra = o.id_obra)) OR EXISTS(SELECT DISTINCT pa.id_obra 
FROM Participa pa
WHERE pa.id_obra = o.id_obra AND EXISTS(SELECT DISTINCT l.nombre FROM Lugar l
    WHERE l.nombre LIKE '%Barcelona%' AND EXISTS(SELECT DISTINCT tl.id_lugar FROM TieneLugar tl
        WHERE tl.id_lugar = l.id_lugar AND tl.id_profesional = pa.id_profesional))) OR EXISTS(SELECT DISTINCT er.id_obra 
        FROM EstaRelacionado er 
            WHERE er.id_obra = o.id_obra AND EXISTS(SELECT DISTINCT k.keyword 
            FROM Keywords k
                WHERE k.id_keyword = er.id_keyword AND k.keyword LIKE '%Barcelona%')); 

它基本上做的是搜索我的数据库中的每部电影,这部电影以某种方式与它所获得的城市相关。我希望第三列显示每个结果,结果显示行的结果(例如:TITLE CONTAINS IT,或者来自MOVIE BORN的演员等)

感谢您的耐心和帮助!

编辑:正如所建议的,这里有一些输出的例子。该列应该只显示与电影相关的第一个原因:

TITULO            FECHA_ESTRENO        CAUSE
----------       ----------------    ----------
Barcelona mia         1967             TITLE

2 个答案:

答案 0 :(得分:1)

https://www.postgresql.org/docs/7.4/static/functions-conditional.html

  

SQL CASE表达式是一个通用的条件表达式,类似   to if / else其他语言的语句:

CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result] 
END 
     

CASE子句可以在表达式有效的任何地方使用。 condition是一个返回布尔结果的表达式。如果   结果为true,那么CASE表达式的值就是结果   遵循这个条件。如果结果为假,则后续WHEN   条款以相同的方式搜索。如果没有WHEN条件为真   然后case表达式的值是ELSE中的结果   条款。如果省略ELSE子句并且没有条件匹配,则   结果为空。

您的案例示例:

SELECT (CASE WHEN EXISTS(... l.nombre LIKE '%Barcelona%') THEN 'TITLE CONTAINS IT' WHEN <conditon for actor> THEN 'ACTOR WA BORN THERE' WHEN ... END) as reason

答案 1 :(得分:1)

这是一个解决方案。

  • 为每个搜索条件创建子查询。
  • 在子查询中包含原因&#39;突起
  • 外部连接子查询,因此不管哪一个
  • 过滤以确保至少有一个子查询具有正结果
  • 使用coalesce()得出一个理由。

我还没有完成你所有的条件,而且我可能会破坏你的逻辑,但这是一般的想法:

SELECT o.titulo
       , o.fecha_estreno
       , coalesce(t1.reason, t2.reason) as reason
FROM Obra o 
     left outer join ( select id_obra, 'title contains it' as reason 
                       from Obra 
                       where titulo LIKE '%Barcelona%' ) t1
     on t1.id_obra  o.id_obra
     left outer join ( select distinct pa.id_obra , 'takes place there' as reason 
                       from Participa pa
                            join TieneLugar tl
                            on  tl.id_profesional = pa.id_profesional 
                            join Lugar l
                            on  tl.id_lugar = l.id_lugar
                       where l.nombre LIKE '%Barcelona%' ) t2
     on t2.id_obra  o.id_obra
WHERE t1.id_obra is not null
or t2.id_obra is not null
/

coalesce()只返回第一个非空值,这意味着如果您获得多个匹配,您将看不到多个原因。因此,命令参数将最有力的理由放在第一位。

此外,您应该考虑使用Oracle Text。这是解决这种关键字搜索的最明智的方法。 Find out more