У меня есть проблема, над которой я работаю. Ниже приведен упрощенный запрос, показывающий проблему:
WITH the_table AS (
SELECT a, b
FROM (VALUES('data1', 2), ('data3', 4), ('data5', 6)) x (a, b)
), my_data AS (
SELECT 'data7' AS c, array_agg(ROW(a, b)) AS d
FROM the_table
)
SELECT c, d[array_upper(d, 1)]
FROM my_data
В разделе моих данных вы заметите, что я создаю массив из нескольких строк, и массив возвращается в одной строке с другими данными. Этот массив должен содержать информацию как для a
, так и для b
, а также связывать два значения вместе. Казалось бы, имеет смысл использовать анонимную строку или запись (я хочу избежать фактического создания составного типа).
Все это работает хорошо, пока мне не нужно начать извлекать данные обратно. В приведенном выше примере мне нужно получить доступ к последней записи в массиве, что легко сделать с помощью array_upper
, но затем мне нужно получить доступ к значению в том, что раньше было столбцом b
, что я не могу понять, как это сделать.
По сути, прямо сейчас возвращается приведенный выше запрос:
"data7";"(data5,6)"
И мне нужно вернуться
"data7";6
Как я могу это сделать?
ПРИМЕЧАНИЕ. Хотя в приведенном выше примере я использую текст и целые числа в качестве типов для своих данных, они не являются фактическими конечными типами, а скорее используются для упрощения примера.
ПРИМЕЧАНИЕ. Здесь используется PostgreSQL 9.2.
РЕДАКТИРОВАТЬ: Для уточнения, что-то вроде SELECT 'data7', 6
- это не то, что мне нужно. Представьте, что the_table на самом деле извлекает из таблиц базы данных, а не оператор WITH, который я вставил для удобства, и я не всегда знаю, какие данные находятся в таблице.
Другими словами, я хочу иметь возможность сделать что-то вроде этого:
SELECT c, (d[array_upper(d, 1)]).b
FROM my_data
И верните это:
"data7";6
По сути, как только я поместил что-то в анонимную запись с помощью функции row(), как мне получить это обратно? Как разделить часть 'data5'
и часть 6
, чтобы они не возвращались в один столбец?
Другой пример:
SELECT ROW('data5', 6)
заставляет «data5» и 6 возвращаться в один столбец. Как мне взять этот столбец и разбить его на два исходных?
Я надеюсь, что это проясняет
SELECT 'data7', 6;
, которое, очевидно, не то, что вы ищете... - person Patrick   schedule 06.12.2014