PostgreSQL: ВЫБЕРИТЕ все поля, отфильтруйте некоторые - PullRequest
2 голосов
/ 07 июня 2010

В одной из наших баз данных есть таблица с десятками столбцов, одним из которых является столбец геометрии.

Я хочу SELECT строк из таблицы, с геометрией, преобразованной в другую SRID .Я хочу использовать что-то вроде:

`SELECT *`

, чтобы избежать:

SELECT col_a, col_b, col_c, col_d, col_e, col_f, 
       col_g, col_h, transform(the_geom, NEW_SRID), ..., col_z

Есть идеи?

Адам

Ответы [ 5 ]

5 голосов
/ 07 июня 2010

То есть у вас проблема с длиной предложения SELECT в запросе?Ну, я думаю, вы могли бы подумать:

SELECT *, transform(the_geom, NEW_SRID) as newsrid

, что, очевидно, очень мало.Однако это означает, что вы получаете значение столбца 'the_geom' дважды для каждой строки.

Редактировать: Хочу подчеркнуть, что я не говорю, что мне нравится делать "SELECT *".Независимо от того, сколько столбцов я выбираю из таблицы, я всегда четко указываю имена.Таким образом, это приводит нас к другому вопросу: «В чем проблема с явным присвоением имен всем столбцам?»,Я знаю, что это много печатает, но опять же, в чем проблема?Это единовременная проблема.Вероятно, есть программы управления БД, которые могут даже сгенерировать запрос для вас.По крайней мере, программное обеспечение, которое мы используем, может.

Использование группового символа не является хорошей практикой, по крайней мере, в этой ситуации.Это нелегко поддерживать, потому что в вашей среде программирования вы не можете видеть список столбцов.Вы всегда должны будете проверить это через программу управления БД.И я надеюсь, что вы не получаете доступ к столбцам по индексу?Как:

object columnvalue = row[21];

Потому что это, в сочетании с джокером, сделает вашу программу настоящим адом в обслуживании.Действительно, даже если вам потребуется больше времени на программирование, в конце концов, присвоение имен столбцам в вашем запросе окупится.

2 голосов
/ 07 июня 2010

Если вы хотите избежать ввода имен столбцов, то что-то вроде

 SELECT array_to_string(array(SELECT CASE column_name WHEN 'the_geom' THEN 'transform(the_geom, NEW_SRID)' ELSE column_name END
 FROM information_schema.columns WHERE table_name = 'the_table'),E',\n');

даст вам список и изменит необходимый столбец, а затем может быть помещен в оператор выбора

1 голос
/ 07 июня 2010
SELECT 
  *, -- get all
  transform(the_geom, NEW_SRID) -- special case
FROM
  ...
0 голосов
/ 09 июня 2010
select attname 
from pg_catalog.pg_attribute 
where not attisdropped 
    and attrelid=(select distinct tableoid from mytable);

вернет имена столбцов в «mytable». Я не могу понять, как сделать все остальное строго в postgres, но вы могли бы написать функцию на любом языке, который вы используете для объединения этих столбцов, кроме тех, которые вам не нужны, и вернуть строку выбора.

Или я бы просто использовал этот оператор, чтобы вытащить все столбцы и использовать его, чтобы отредактировать те, которые мне нужны, и написать свой запрос таким образом и покончить с этим. Если вам не нравится 50-строчный запрос, расположенный в середине вашего кода, поместите его в библиотеку, чтобы вам не пришлось его видеть.

0 голосов
/ 07 июня 2010

После того, как вы выбрали столбец, вы больше не сможете его убрать.

Вы можете создать представление, представляющее интересующие вас данные, а затем выполнить свой запрос на этот счет, но, тем не менее, вам лучше просто явно назвать нужные столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...