Oracle SQL выбирает несколько столбцов в одной таблице с одинаковым типом и превращает их в несколько строк

#sql #oracle

#sql #Oracle

Вопрос:

у меня есть следующая таблица

введите описание изображения здесь

Спасибо

Комментарии:

1. не уверен, почему изображение не появилось, пожалуйста, нажмите «введите описание изображения здесь», спасибо!

2. Вам лучше избегать изображений, предпочитая форматированный текст: текстовые данные позволяют людям создавать пример и пробовать свои ответы.

Ответ №1:

Один простой способ — выбрать каждый из ваших временных столбцов отдельно, а затем отобразить их вместе с UNION ALL :

 SELECT * FROM (
    SELECT user_id, receive_time AS time, NULL AS user_message FROM table WHERE receive_time IS NOT NULL
    UNION ALL
    SELECT user_id, open_time, NULL FROM table WHERE open_time IS NOT NULL
    UNION ALL
    SELECT user_id, finish_time, user_message FROM table WHERE finish_time IS NOT NULL)
ORDER BY time, user_id
  

Ответ №2:

В зависимости от вашего правила заполнения и отображения user_message запроса, возможно, потребуется изменить, но общим правилом здесь было бы получить все записи для каждого *_time столбца и использовать union all их для объединения

 select *
from (
  select user_id, receive_time AS time, null AS user_message
  from yourtable
  where receive_time is not null
  union all
  select user_id, open_time, null
  from yourtable
  where open_time is not null
  union all
  select user_id, finish_time, user_message
  from yourtable
  where finish_time is not null
)
order by time, user_id
  

С WHERE помощью предложения мы не возвращаем строки, в которых определенный столбец времени пуст. Это, по-видимому, желательно из вашего выходного примера.

Комментарии:

1. когда я упорядочиваю по времени, он говорит «ORA-00904: «TIME»: недопустимый идентификатор 00904. 00000 — «%s: недопустимый идентификатор», независимо от верхнего / нижнего регистра или другого имени переменной. Я могу заказать по идентификатору пользователя, но я не могу заказать по идентификатору my_user_id, если я использую «выбрать идентификатор пользователя в качестве идентификатора my_user_id»

2. В моем скрипте нет идентификатора «THE_TIME». В любом случае, попробуйте обернуть его с select * from( ... ) order by time, user_id помощью 😉

3. спасибо, Камиль, за быстрый ответ, я отредактировал приведенный выше комментарий, позвольте мне попробовать

4. Я соответствующим образом изменил свой ответ. Похоже, для этого Oracle нужен подзапрос 🙂