2017-02-18 18 views

ответ

3

Ограничение состоит в том, что все ветви выражения 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 содержать переменный номер столбца ...

Обратите внимание, что вы получите один результата колонки либо способ, обходные пути только содержат переменную полезную нагрузку, которую можно разложить на следующем шаге.

+0

Спасибо вам большое! –

0

Нет, вы не можете, так как выбор столбцов являются статическими. Если вы действительно хотите динамически выбирать столбцы на основе некоторого условия, тогда подумайте о создании для этой цели dynamic query.

+1

Динамический SQL может помочь только с этим, если задан параметр ввода «x», поэтому мы можем выполнить другой запрос в зависимости от него. Если 'x' - столбец таблицы, ничего не может сделать динамический запрос. SQL не позволяет изменять разные типы в результате. В стороне, ваша ссылка на ecpg Postgres 9.1. Более полезным ресурсом будет plpgsql текущей версии: https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN –