Есть ли способ для SELECT
всех столбцов в таблице, кроме определенных? Это было бы очень удобно для выбора всех неблобных или негеометрических столбцов из таблицы.
Что-то вроде:
SELECT * -the_geom FROM segments;
- Однажды я слышал, что эта функциональность была преднамеренно исключена из стандарта SQL, поскольку изменение добавления столбцов в таблицу изменит результаты запроса. Это правда? Является ли аргумент действительным?
- Есть ли обходной путь, особенно в PostgreSQL?
postgresql
sql-standard
Адам Матан
источник
источник
name
,age
,sid
) , который прекрасно вписывается в ширину экрана, Alongwith длинного бинарногоgeom
колонка. Я хочу сделать запрос ко всем полям, кроме двоичного объекта геометрии, и писать их имена по одному утомительно.select (!coluns2,!column5) from sometable;
Ответы:
Такая функция не существует ни в Postgres, ни в стандарте SQL (AFAIK). Я думаю, что это довольно интересный вопрос, поэтому я немного погуглил и наткнулся на интересную статью на postgresonline.com .
Они показывают подход, который выбирает столбцы непосредственно из схемы:
Вы можете создать функцию, которая делает что-то подобное. Такие темы также обсуждались в списках рассылки, но общий консенсус был почти таким же: запросить схему.
Я уверен, что есть другие решения, но я думаю, что все они будут включать в себя какую-то магическую схему-запрос-foo.
Кстати: будьте осторожны с
SELECT * ...
этим, поскольку это может иметь потери производительностиисточник
Реальный ответ заключается в том, что вы просто не можете практически. Эта функция была востребована на протяжении десятилетий, и разработчики отказались от ее реализации.
Популярный ответ, предлагающий запрос таблиц схемы, не сможет работать эффективно, потому что оптимизатор Postgres считает динамические функции черным ящиком (см. Контрольный пример ниже). Это означает, что индексы не будут использоваться и соединения не будут выполняться интеллектуально. Вам было бы намного лучше с какой-нибудь макро-системой, такой как m4. По крайней мере, это не смущает оптимизатор (но может все еще смущать вас). Без разветвления кода и написания функции самостоятельно или использования интерфейса языка программирования, который вы застряли.
Ниже я написал простое доказательство концепции, показывающее, насколько плохой будет производительность при очень простом динамическом выполнении в plpgsql. Также обратите внимание, что ниже я должен привести функцию, возвращающую общую запись к определенному типу строки, и перечислить столбцы. Таким образом, этот метод не будет работать для «выберите все, кроме», если вы не хотите переделать эту функцию для всех ваших таблиц.
Как вы можете видеть, вызов функции сканировал всю таблицу, в то время как прямой запрос использовал индекс ( 95,46 мс против 00,07 мс .). Эти типы функций будут включать любой сложный запрос, который должен использовать индексы или объединять таблицы в правильном порядке. ,
источник
На самом деле это возможно в PostgreSQL, начиная с 9.4, где был представлен JSONB. Я размышлял о подобном вопросе о том, как показать все доступные атрибуты в Google Map (через GeoJSON).
johto на канале irc предлагает попробовать удалить элемент из JSONB.
Вот идея
Хотя вы получаете JSON вместо отдельных столбцов, это было именно то, что я хотел. Возможно, JSON можно расширить обратно в отдельные столбцы.
источник
Единственный способ, которым вы можете (не говорите, что должны), это использовать динамические операторы SQL. Легко (как писал DrColossos) запрашивать системные представления, находить структуру таблицы и строить правильные операторы.
PS: Почему вы хотите выбрать все / некоторые столбцы, не зная / не записав точно структуру вашей таблицы?
источник
Динамически, как указано выше, является единственным ответом, но я не буду рекомендовать его. Что, если вы добавите больше столбцов в долгосрочной перспективе, но они не обязательно требуются для этого запроса?
Вы бы начали тянуть больше столбца, чем вам нужно.
Что делать, если выбор является частью вставки, как в
Вставить в таблицу A (col1, col2, col3 .. coln) Выбрать все, кроме 2 столбцов ИЗ таблицыB
Соответствие столбцов будет неправильным, и ваша вставка не удастся.
Это возможно, но я все же рекомендую писать каждый необходимый столбец для каждого написанного выбора, даже если требуется почти каждый столбец.
источник
SELECT
s.Если ваша цель состоит в том, чтобы убрать помехи с экрана во время отладки, не отображая столбцы с большими значениями данных, то вы можете использовать следующий прием:
(установите пакет "hstore" contrib, если у вас его еще нет: "
CREATE EXTENSION hstore;
")Для таблицы «test» с col1, col2, col3 вы можете установить значение «col2» в null перед отображением:
Или установите два столбца в null перед отображением:
предостережение в том, что «test» должен быть таблицей (псевдоним или подвыбор не будет работать), так как должен быть определен тип записи, передаваемый в hstore.
источник
Я только что обнаружил обходной путь, но он требует отправки SQL-запросов из R. Он может быть полезен для пользователей R.
По сути,
dplyr
пакет отправляет запросы SQL (и особенно PostgreSQL) и принимает-(column_name)
аргумент.Итак, ваш пример может быть записан следующим образом:
источник
В комментарии вы объясняете, что ваш мотив состоит в том, чтобы удобнее не отображать содержимое столбцов с длинным содержимым, а не отображать сам столбец:
Это возможно с помощью вспомогательной функции, которая заменяет длинное содержимое на
null
(любойtext
столбец в моем примере, но вы бы изменили его для типов, которые вы хотите подавить):dbfiddle здесь
источник
С точки зрения приложения это ленивое решение. Приложение вряд ли автоматически узнает, что делать с новыми столбцами.
Приложения браузера данных могут запрашивать метаданные для данных и исключать столбцы из выполняемых запросов или выбирать подмножество данных столбца. Новые BLOB-объекты могут быть исключены при добавлении. Данные BLOB для определенных строк могут быть выбраны по запросу.
В любом варианте SQL, который поддерживает динамические запросы, запрос может быть построен с использованием запроса к метаданным таблиц. Для вашего намерения я бы исключил столбцы по типу, а не по имени.
источник
Вы никогда не видите
*
в SQL-VIEWS ... проверьте\d any_view
на свойpsql
. Существует (интроспективная) предварительная обработка для внутреннего представления.Все обсуждение здесь показывает , что предложение вопроса (неявное в вопросе и дискуссиях) является синтаксис для программистов, а не реальный «оптимизация SQL вопроса» ... Ну, я думаю, это на 80% программист.
Так что может быть реализовано как « предварительный анализ с самоанализом» ... Посмотрите, что делает PostgreSQL, когда вы объявляете SQL-VIEW с помощью
SELECT *
: конструктор VIEW превращается*
в список всех столбцов (посредством самоанализа и в тот момент, когда вы запускаете СОЗДАТЬ ВИД исходного кода).Реализация для CREATE VIEW и PREPARE
Это жизнеспособная реализация. Предположим, таблица
t
с полями(id serial, name text, the_geom geom)
.То же самое для ПОДГОТОВКИ .
... так, это возможно, и это то, что нужно 80% программистов, синтаксический сахар для ПОДГОТОВКИ и ПРОСМОТРОВ!
Примечание: конечно жизнеспособный синтаксис возможно не
- column_name
, если есть какой - то конфликт в PostgreSQL, так что мы можем предложитьEXCEPT column_name
,EXCEPT (column_name1, column_name2, ..., column_nameN)
или другие.источник
Это моя функция, чтобы выбрать все столбцы, кроме одного. Я объединил идеи из postgresonline.com и postgresql tuturial и из других источников.
источник