SQL - отображение запросов - PullRequest
1 голос
/ 29 марта 2020

В настоящее время я тестирую некоторые запросы, и этот запрос ниже

select DISTINCT GENRES
FROM GENRES ;

Показывает:

  Genres
0 Action,Adventure,Romance
1 Drama

Как бы я написал его, чтобы он отображал вывод в формате ниже?

  Genres
1 Action
2 Adventure
3 Romance
4 Drama

Любая помощь будет полезна! Спасибо

Ответы [ 3 ]

1 голос
/ 29 марта 2020

Вот один из способов разделить строку csv с помощью регулярных выражений и рекурсивного запроса:

select distinct trim(regexp_substr(genre, '[^,]+', 1, level)) genre
from mytable
connect by instr(genre, ',', 1, level - 1) > 0

Демонстрация на DB Fiddle :

with mytable as (
    select 'Action,Adventure,Romance' genre from dual
    union all select 'Drama' from dual
)
select distinct trim(regexp_substr(genre, '[^,]+', 1, level)) genre
from mytable
connect by instr(genre, ',', 1, level - 1) > 0
| GENRE     |
| :-------- |
| Action    |
| Adventure |
| Romance   |
| Drama     |
0 голосов
/ 29 марта 2020

"это работает, но скажите, если больше жанров введено позже". Несмотря на работающее решение, ваша модель данных сама по себе имеет существенные недостатки. Это нарушает первую нормальную форму. Кроме того, очень сложно иметь таблицу и столбец с одним и тем же именем (GENRES). У вас должно быть 3 таблицы для моделирования этих данных:

SQL> CREATE TABLE MOVIES
  2     (MOVIE_ID NUMBER NOT NULL ENABLE,
  3      TITLE VARCHAR2(20 BYTE) NOT NULL ENABLE,
  4      DIRECTOR VARCHAR2(20 BYTE) NOT NULL ENABLE,
  5           CONSTRAINT MOVIES_PK PRIMARY KEY (MOVIE_ID)
  6     );

Table created.

SQL>
SQL> CREATE TABLE MOVIE_GENRES
  2     (GENRE_ID NUMBER NOT NULL ENABLE,
  3      GENRE_NAME VARCHAR2(20 BYTE),
  4           CONSTRAINT MOVIE_GENRES_PK PRIMARY KEY (GENRE_ID)
  5     );

Table created.

SQL>
SQL> CREATE TABLE LK_MOVIES_GENRES
  2     (LK_MOVIES_GENRES_ID NUMBER NOT NULL ENABLE,
  3      MOVIE_ID NUMBER NOT NULL ENABLE,
  4      GENRE_ID NUMBER NOT NULL ENABLE,
  5           CONSTRAINT LK_MOVIES_GENRES_PK PRIMARY KEY (MOVIE_ID),
  6           CONSTRAINT FK_MOVIES FOREIGN KEY (MOVIE_ID)
  7            REFERENCES MOVIES (MOVIE_ID) ENABLE,
  8           CONSTRAINT FK_GENRES FOREIGN KEY (GENRE_ID)
  9            REFERENCES MOVIE_GENRES (GENRE_ID) ENABLE
 10     );

Table created.
0 голосов
/ 29 марта 2020
SQL> with genres (id, genres) as
  2    (select 0, 'Action,Adventure,Romance' from dual union all
  3     select 1, 'Drama' from dual
  4    )
  5  select rownum id,
  6    regexp_substr(genres, '[^,]+', 1, column_value) genres
  7  from genres cross join
  8       table(cast(multiset(select level from dual
  9                           connect by level <= regexp_count(genres, ',') + 1
 10                          ) as sys.odcinumberlist));

        ID GENRES
---------- --------------------
         1 Action
         2 Adventure
         3 Romance
         4 Drama

SQL>
...