Ограничение состоит в том, что все ветви выражения CASE
должны быть разрешены к одинаковым типом данных. The manual:
типы данных всех результата выражений должны быть обменены на одного типа продукции. См. Section 10.5 для более подробной информации.
Если все ваши выходные столбцы имеют совместимый тип данных, вы могли бы использовать ARRAY включить переменное число столбцов (в результате того же типа массива). Как:
SELECT CASE x
WHEN 1 THEN ARRAY[y]
WHEN 2 THEN ARRAY[x,y,z]
-- no ELSE defaults to NULL
END AS my_result_array
FROM tbl;
Если не, вы можете бросить в общий тип элемента по вашему выбору (text
будет безопасной по умолчанию):
SELECT CASE x
WHEN 1 THEN ARRAY[x::text]
WHEN 2 THEN ARRAY[x::text, y::text, z::text]
END AS my_result_array
FROM tbl;
Или, чтобы заставить его работать на разнородные типы данных, вы можете использовать составной тип (тип строки) и pad с значениями NULL. Название, количество и тип выходных столбцов являются фиксированными и должны охватывать все возможные комбинации результатов.
CREATE TYPE foo (a int, b text, c date);
SELECT CASE x
WHEN 1 THEN (x, NULL, NULL)::foo
WHEN 2 THEN (x, y, z)::foo
END AS my_result_array
FROM tbl;
Или вы можете использовать тип документа, как json
, hstore
или xml
содержать переменный номер столбца ...
Обратите внимание, что вы получите один результата колонки либо способ, обходные пути только содержат переменную полезную нагрузку, которую можно разложить на следующем шаге.
Спасибо вам большое! –