Как получить несколько строк из таблицы базы данных одной строки из PostgreSQL? - PullRequest
0 голосов
/ 22 октября 2018

У меня есть имя таблицы базы данных PostgreSQL Intime

| Name  |  Intime1 |      Intime2     |   Intime3 |      Intime4     |  Intime5 |      Intime6     |
|-------|----------|------------------|-----------|------------------|----------|------------------|
| Zakir |          |    02/01/18:9.00 |           |    04/01/18:9.07 |          |    06/01/18:9.05 |

Я хочу из этой таблицы:

| Name  |     Intime    |
|-------|---------------|
| Zakir | 02/01/18:9.00 |
| Zakir | 04/01/18:9.07 |
| Zakir | 06/01/18:9.05 |

Что теперь за запрос в postgresql?

Ответы [ 2 ]

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

Используйте боковое соединение:

select t.name, v.intime
from t cross join lateral
      (values (intime1), (intime2), (intime3), (intime4), (intime5), (intime6)
      ) v(intime);

Боковые объединения - это стандартный синтаксис ANSI / ISO, который может быть довольно мощным.Удаление данных - это только одна вещь, которую можно сделать с ними.

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

Использовать UNION:

select name, intime1 as intime
from intime
union all
select name, intime2
from intime
union all
select name, intime3
from intime
union all
select name, intime4
from intime
union all
select name, intime5
from intime
union all
select name, intime6
from intime

Другое - специфичное для Postgres - решение будет использовать unnest для массива столбцов:

select i.name, t.intime
from intime as i
  cross join unnest(array[intime1,intime2,intime3,intime4,intime5,intime6]) as t(intime);

Если вы также хотитезнать, к какому столбцу принадлежит каждая строка, вы можете использовать with ordinality:

select i.name, t.intime, t.nr
from intime as i
  cross join unnest(array[intime1,intime2,intime3,intime4,intime5,intime6]) with ordinality as t(intime,nr);

Онлайн пример: https://rextester.com/CDHVI81806

...