我现在已经搜索了很长一段时间,但我还没能找到我正在寻找的答案。我有以下查询:
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
答案 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)
这是一个解决方案。
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