Sql вывести все поля кроме одного

Как выводить в запросе все столбцы кроме одного, не перечисляя их?

Другими словами, как исключить столбец с известным именем из результата запроса select * from Table?

Перечислять столбцы также приходится в операторе INSERT, исключая из списка автоинкрементируемые столбцы или столбцы, которым нужно присвоить значение по умолчанию.

Допустим, требуется выбрать все столбцы из таблицы Laptop кроме столбца code. Чтобы вывести все столбцы таблицы, достаточно написать

Но чтобы исключить из списка столбец code, мы вынуждены перечислить все остальные столбцы:

Было бы неплохо, если мы могли написать что-то типа

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

Но, увы, такой возможности у нас нет. Зато мы можем сформировать список столбцов с помощью вспомогательного скрипта, чтобы в дальнейшем использовать его результаты в запросах. Это мы можем сделать, используя стандартное представление метаданных, которое называется информационной схемой:

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

SQL Server

В частности, для SQL Server мы можем это сделать при помощи конструкции FOR XML PATH, заменив попутно с помощью функции REPLACE пробел между именами столбцов на запятые:

В принципе, мы в состоянии сформировать требуемый оператор целиком с тем, чтобы его можно было динамически использовать в коде приложения:

MySQL

В случае MySQL мы можем воспользоваться специальной агрегатной функцией GROUP_CONCAT:

Следует отметить, что в MySQL информационная схема относится не к отдельной базе данных, а ко всему серверу. Поэтому на тот случай, если в разных базах сервера имеются таблицы с одинаковыми именами, в условия отбора нужно добавить предикат с указанием схемы (базы данных): TABLE_SCHEMA=’computers’.

Конкатенация в MySQL выполняется с помощью функции CONCAT. В итоге окончательное решение нашей задачи можно написать так:

PostgreSQL

В PostgreSQL задачу представления значений столбца в виде текстового списка можно решить при помощи двух встроенных функций: ARRAY и ARRAY_TO_STRING. Первая из них преобразует выборку в массив значений, а вторая преобразует массив в список. При этом вторым параметром функции ARRAY_TO_STRING задается символ, который будет являться разделителем элементов списка. Теперь решение нашей задачи можно записать в виде:

Источник

SQL: SELECT все столбцы, кроме некоторых

Есть ли способ для SELECT всех столбцов в таблице, кроме определенных? Это было бы очень удобно для выбора всех неблобных или негеометрических столбцов из таблицы.

  • Однажды я слышал, что эта функциональность была преднамеренно исключена из стандарта SQL, поскольку изменение добавления столбцов в таблицу изменит результаты запроса. Это правда? Является ли аргумент действительным?
  • Есть ли обходной путь, особенно в PostgreSQL?

Такая функция не существует ни в 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

Соответствие столбцов будет неправильным, и ваша вставка не удастся.

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

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

(установите пакет «hstore» contrib, если у вас его еще нет: » CREATE EXTENSION hstore; «)

Для таблицы «test» с col1, col2, col3 вы можете установить значение «col2» в null перед отображением:

Или установите два столбца в null перед отображением:

предостережение в том, что «test» должен быть таблицей (псевдоним или подвыбор не будет работать), так как должен быть определен тип записи, передаваемый в hstore.

Я только что обнаружил обходной путь, но он требует отправки SQL-запросов из R. Он может быть полезен для пользователей R.

По сути, dplyr пакет отправляет запросы SQL (и особенно PostgreSQL) и принимает -(column_name) аргумент.

Итак, ваш пример может быть записан следующим образом:

В комментарии вы объясняете, что ваш мотив состоит в том, чтобы удобнее не отображать содержимое столбцов с длинным содержимым, а не отображать сам столбец:

… Иногда я хочу запросить таблицу с геометрическим столбцом, не отображая очень длинную геометрическую строку, которая искажает вывод. Я не хочу указывать все столбцы, потому что может быть несколько десятков.

Это возможно с помощью вспомогательной функции, которая заменяет длинное содержимое на null (любой text столбец в моем примере, но вы бы изменили его для типов, которые вы хотите подавить):

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

Приложения браузера данных могут запрашивать метаданные для данных и исключать столбцы из выполняемых запросов или выбирать подмножество данных столбца. Новые 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) или другие.

Источник

Как выбрать все столбцы таблицы, кроме одного столбца?

Как выбрать все столбцы таблицы, кроме одного столбца?

У меня есть почти 259 столбцов. Я не могу указать 258 столбцов в инструкции SELECT .

Есть ли другой способ сделать это?

Этот подход можно использовать для получения данных из всех столбцов, кроме одного: –

  • Вставьте все данные во временную таблицу
  • Затем отпустите столбец, который вы не хотите использовать во временной таблице
  • Получить данные из временной таблицы (это не будет содержать данные удаленного столбца)
  • Удалить временную таблицу

Что-то вроде этого:

Создайте представление. Да, в заявлении о создании представлений вам нужно будет перечислить каждое… и… каждое… поле… по… имени.

Затем просто select * from viewname после этого.

Вы можете получить данные имени столбца из таблицы sys.columns

Попробуйте выполнить следующий запрос:

Есть много доступных вариантов, один из которых:

Здесь col_x – это столбец, который вы не хотите включать в оператор select.

Без создания новой таблицы вы можете просто (например, с mysqli):

  • получить все столбцы
  • прокрутите все столбцы и удалите нужный вам
  • сделайте свой запрос

Я просто хотел повторить комментарий @Luann, поскольку я всегда использую этот подход.

Просто щелкните правой кнопкой мыши по таблице> Таблица сценариев, как> Выбрать в> Новое окно запроса.

Вы увидите запрос выбора. Просто уберите столбец, который вы хотите исключить, и у вас есть предпочтительный запрос выбора.

В вашем случае разверните столбцы этой базы данных в проводнике объектов. Перетащите столбцы в область запроса.

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

Попробуйте выполнить следующий запрос:

Есть только один способ достичь этого имени. Другого метода не найдено. Вы должны перечислить все имена столбцов

Это не универсальное решение, но некоторые базы данных позволяют использовать регулярные выражения для указания столбцов.

Например, в случае Hive следующий запрос выбирает все столбцы, кроме ds и hr:

Очевидно, SQL не был разработан программистами.

Если вы используете DataGrip, вы можете сделать следующее:

  1. Введите свой оператор SELECT SELECT * FROM ;
  2. Наведите курсор на * и нажмите Alt+Enter
  3. Вы получите всплывающее меню с опцией Expand column list
  4. Нажмите на него, и он будет преобразован * с полным списком столбцов
  5. Теперь вы можете удалить ненужные столбцы

Источник

Выбрать все, кроме

то вообще не работает

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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Выбрать все записи кроме первой sql
Здравствуйте! Подскажите как вытащить все записи кроме первой? Хотелось бы как-то по красивей.

Как выбрать все значения, кроме максимальных?
Помогите решить проблему есть база с проходной необходимо выбрать все входы кроме первого за каждый.

Выбрать все записи кроме первых и последних десяти
Каквыбрать все записи кроме первых 10 и последних 10?

Выбрать всех кроме
SELECT * FROM travelers WHERE country <> «USA» AND country <> «Canada» AND country <>.

Не могу выбрать другой диск, кроме C:
Работаю в EM, при выполнении attach Database менеджер дает выбрать только диск С:. При BackUp тоже.

Регулярка. Выбрать все слова кроме определённых
Пытаюсь получить регулярным выражением данные, но опыта нет. Прошу помощи. К примеру есть строка.

Выбрать все изображения, кроме тех у которых
Мне нужно выбрать из области класса .cards все картинки, у которых opacity!=1; Как можно сделать.

Выбрать все дочерние элементы, кроме указанных
Как при помощи jquery выбрать все дочерние элементы, кроме указаных? Добавлено через 1 минуту.

Как в OpenDialog выбрать все файлы кроме файлов с опредеоенным расширением .
Как в OpenDialog выбрать все файлы кроме файлов (например) с tmp расширением .

Источник

Читайте также:  Чем чистят духовой шкаф
Оцените статью