объединить часть содержимого столбца и выбрать в одном запросе - PullRequest
1 голос
/ 23 марта 2019

Вот моя таблица фильмов:

FILM (Catalog_Num, Format, Title, Year, Number_Discs, Rating, Timing, Genre)

Я хочу объединить столбец жанра, если год до 1970 года, и его нельзя повторить, например, если жанр - Романтика -> (КлассикаРомантика) все в порядке.

, но жанр уже классический, он должен оставаться классическим, а не (классический классический)

, после этого я должен перечислить id, название и жанр всехклассический фильм.

Вот что я попробовал:

select genre|| 'Classic'
from film where (year <1970 and genre not in ('Classic'));

select film_id, title, genre
from inventory, film
where film.catalog_num = inventory.catalog_num and genre like '%Classic%';

Но на выходе показаны только все жанры в классическом стиле, а не романская классика.Далее, мне нужно закончить в одном запросе , но я не знаю, как их объединить.

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Используйте подзапрос для манипулирования данными и подачи их в ваш основной запрос:

with films as ( 
     select catalog_num 
            , title
            , case
               when (year <1970 and genre not in ('Classic'))
               then 'Classic ' || genre
               else genre end as genre
           from film
  )
select inventory.film_id
       , films.title
       , films.genre
from inventory
     join films on films.catalog_num = inventory.catalog_num
where  films.genre like '%Classic%';

Ваш вопрос говорит, что вы хотите Романтика -> (Классическая романтика) , но ваш опубликованный кодимеет genre||'Classic, что наоборот.Я изменил код для генерации «Классического романа».


Примечание. Вы не добавили псевдонимы столбцов в проекции второго запроса, поэтому мне пришлось угадывать, какие столбцы взяты из film, а какиеот inventory.Вам нужно будет исправить любое неправильное предположение.

1 голос
/ 23 марта 2019

Если вам нужно только ваше определение классных фильмов, тогда вам не нужно менять жанр.Просто сделайте:

select i.film_id, f.title, f.genre
from inventory i join
     films f
     on f.catalog_num = i.catalog_num
where f.genre like '%Classic%' or f.year < 1970;

Если вы все еще хотите «Классика» в жанре:

select i.film_id, f.title,
       (case when f.year < 1970 and f.genre <> 'Classic'
             then 'Classic ' || f.genre
             else f.genre
        end) as genre
from inventory i join
     films f
     on f.catalog_num = i.catalog_num
where f.genre like '%Classic%' or f.year < 1970;

Ваш вопрос немного расплывчат в том, может ли «Классика» быть частью названия жанраа не все имя.Таким образом, вы можете захотеть:

       (case when f.year < 1970 and f.genre not like '%Classic%'
             then 'Classic ' || f.genre
             else f.genre
        end) as genre

Обратите внимание, что такие сравнения обычно чувствительны к регистру в Oracle, поэтому вам может потребоваться учитывать и прописные / строчные буквы.

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