Написать дополнительный столбец для запроса результата с разными значениями каждый раз - PullRequest
0 голосов
/ 03 мая 2018

Я долго искал и не смог найти ответ на то, что искал. У меня есть следующий запрос:

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 СОДЕРЖИТ ЭТО» или «ACTOR FROM MORIE BORN THERE THERE» и т. Д.)

Спасибо за ваше терпение и помощь!

РЕДАКТИРОВАТЬ: Как предлагается, вот несколько примеров вывода. В столбце должна отображаться только первая причина, связанная с фильмом:

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

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вот одно из решений.

  • Создать подзапрос для каждого условия поиска.
  • включить причину в прогнозы подзапросов
  • external присоединяется к подзапросам, поэтому не имеет значения, какой из них
  • фильтр, чтобы убедиться, что хотя бы один из ваших подзапросов имеет положительный результат
  • используйте 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. Это самый разумный способ поиска такого рода поиска по ключевым словам. Узнать больше .

0 голосов
/ 03 мая 2018

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

Выражение SQL CASE является общим условным выражением, аналогичным к операторам if / else на других языках:

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

Предложения CASE могут использоваться везде, где допустимо выражение. условие - это выражение, которое возвращает логический результат. Если результат true тогда значение выражения CASE является результатом это следует из условия. Если результат ложен любой последующий, КОГДА пункты ищутся таким же образом. Если нет, КОГДА условие верно тогда значение выражения 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...