Моя тестовая таблица выглядит так:
# select * from a;
source | target | id
--------+--------+----
1 | 2 | 1
2 | 3 | 2
3 | 0 | 3
Мой запрос такой:
SELECT *
FROM (
SELECT
CASE
WHEN id<>1
THEN source
ELSE 0
END
AS source,
CASE
WHEN id<>1
THEN target
ELSE 0
END
AS target
FROM a
) x;
Запрос кажется немного странным, потому что выражение CASE с теми же критериями повторяетсядля каждого столбца.Я хотел бы упростить это и попробовал следующее, но это не работает должным образом.
SELECT *
FROM (
SELECT
CASE
WHEN id<>1
THEN (source, target)
ELSE (0, 0)
END
AS r
FROM a
) x;
Это дает один столбец со значением строки, но я бы предпочел получить два исходных столбца.Разделение их с помощью (r). * Или подобного не работает, потому что «тип записи не зарегистрирован».
Я нашел несколько вопросов здесь с решениями относительно функций, возвращающих значения RECORD, но ни одного относительно этогопример с вложенным выбором.
На самом деле список столбцов довольно длинный, поэтому многократное повторение одного и того же выражения CASE делает весь запрос совершенно нечитабельным.
Поскольку настоящая проблема -в отличие от этого упрощенного случая, состоящего из нескольких выражений CASE и нескольких групп столбцов, решение с UNION не поможет, поскольку число UNION будет большим и сделает его нечитаемым, а также несколько CASE.
Мой актуальный вопрос: Как я могу получить исходные столбцы из значения строки?