Oracle Query Select на основе подстрок - PullRequest
0 голосов
/ 16 октября 2018

Выполнена следующая команда:

CREATE TABLE film (
  film_id NUMBER(5) NOT NULL,
  title varchar2(255),
  description varchar2(255),
  release_year NUMBER(4) DEFAULT NULL,
  language_id NUMBER(3) NOT NULL,
  original_language_id NUMBER(3) DEFAULT NULL,
  rental_duration NUMBER(3) DEFAULT 3 NOT NULL,
  rental_rate NUMBER(4,2) DEFAULT '4.99',
  length NUMBER(5) DEFAULT NULL,
  replacement_cost NUMBER(5,2) DEFAULT '19.99' NOT NULL,
  rating varchar2(8) DEFAULT 'G',
  special_features varchar2(255) DEFAULT NULL
);

Предположим, что заполнено множество данных.

Я хочу построить запрос для выбора первых 200 фильмовназвания ( в порядке возрастания в алфавитном порядке ), где фильм происходит в формате Boat.Предположим, что местоположение фильма содержится в таблице фильма и атрибут, описание.Кроме того, это всегда после первого вхождения слова in и заканчивается в конце предложения.Например, в следующем описании фильма:

​A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher 
in The Canadian Rockies

Местоположение The Canadian Rockies.

Пока местоположение содержит слово Boat, все в порядке.Boat может быть любой лодкой, например U-Boat , JET Boat и т. Д.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете использовать функцию instr для слов boat и in с такой комбинацией:

select film_description
  from
(
with t(film_description) as
(
 select '... a Teacher in The Canadian Rockies' from dual union all
 select 'Boat on the river' from dual union all
 select 'on the river in a Boat' from dual union all
 select 'on the river in a U-Boat' from dual union all
 select 'on the river in a JET Boat' from dual    
)
select t.film_description, dense_rank() over (order by t.film_description) as dr
  from t
 where instr(lower(t.film_description),'boat') > instr(t.film_description,' in ')
   and instr(t.film_description,' in ') > 0
)   
where dr <= 200;

или можете использовать следующее при условии, что ваша Oracle DB версия 12c :

with t(film_description) as
(
 ................
 ................ 
 select '... a Teacher in The Canadian Rockies' from dual union all
 select 'Boat on the river' from dual union all
 select 'on the river in a Boat' from dual union all
 select 'on the river in a U-Boat' from dual union all
 select 'on the river in a JET Boat' from dual    
)
select t.film_description
  from t
 where instr(lower(t.film_description),'boat') > instr(t.film_description,' in ')
   and instr(t.film_description,' in ') > 0
fetch first 200 rows only;

Демонстрационная программа Rextester

0 голосов
/ 16 октября 2018

Возможно запрос может выглядеть так:

SELECT * 
FROM "FILM" 
WHERE UPPER("DESCRIPTION") LIKE '%IS%BOAT%'
AND ROWNUM<200;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...