Как выводить в запросе все столбцы кроме одного, не перечисляя их?
Другими словами, как исключить столбец с известным именем из результата запроса 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 задается символ, который будет являться разделителем элементов списка. Теперь решение нашей задачи можно записать в виде:
Выберите все столбцы кроме одного в MySQL?
Я пытаюсь использовать инструкцию select для получения всех столбцов из определенной таблицы MySQL, кроме одного. Есть ли простой способ сделать это?
EDIT: в этой таблице 53 столбца (не мой дизайн)
28 ответов
На самом деле есть способ, вам нужно иметь разрешения, конечно, для этого .
замена <table>, <database> and <columns_to_omit>
посмотреть бы работать лучше в этом случае?
в MySQL definitions (manual) нет такой вещи. Но если у вас действительно большое количество столбцов col1 , . col100 , следующее Может быть полезным:
вы можете сделать:
не получая column3, хотя, возможно, вы искали более общее решение?
Если вы хотите исключить значение поля, например, для проблем безопасности / конфиденциальной информации, вы можете получить этот столбец как null.
насколько мне известно, нет. Вы можете сделать что-то вроде:
и вручную выберите столбцы, которые вы хотите. Однако, если вам нужно много столбцов, вы можете просто сделать:
и просто игнорировать то, что вы не хотите.
в вашем конкретном случае, я бы предложил:
если вы не хотите только несколько столбцов. Если вы хотите только четыре столбца, то:
было бы хорошо, но если вы хотите 50 столбцов, тогда любой код, который делает запрос, станет (тоже? трудно читать.
при попытке решения @Mahomedalid и @Junaid я нашел проблему. Так думал делиться этим. Если имя столбца имеет пробелы или дефисы, такие как регистрация, запрос завершится ошибкой. Простым обходным путем является использование backtick вокруг имен столбцов. Измененный запрос находится ниже
Если в столбце, который вы не хотели выбирать, было огромное количество данных, и вы не хотели включать его из-за проблем со скоростью, и вы часто выбираете другие столбцы, я бы предложил вам создать новую таблицу с одним полем, которое вы обычно не выбираете с ключом к исходной таблице, и удалить поле из исходной таблицы. Присоединяйтесь к таблицам, когда это дополнительное поле действительно требуется.
можно использовать описать таблицы my_table и используйте результаты этого для динамического создания оператора SELECT.
моя главная проблема-это много столбцов, которые я получаю при объединении таблиц. Хотя это не ответ на ваш вопрос (Как выбрать все, кроме определенных столбцов из один таблица), я думаю, стоит упомянуть, что вы можете указать table. чтобы получить все столбцы из таблицы, а не просто задание .
вот пример, как это может быть очень полезно:
в результате все столбцы из таблицы users, и два дополнительные столбцы, которые были объединены в мета таблице.
мне понравился ответ от @Mahomedalid кроме этого факта сообщается в комментарии от @Bill Karwin . Возможные проблемы @Jan Koritak Это правда, я столкнулся с этим, но я нашел трюк для этого и просто хочу поделиться им здесь для тех, кто сталкивается с проблемой.
мы можем заменить функцию REPLACE предложением where в подзапросе подготовленного оператора следующим образом:
используя мою таблицу и имя столбца
таким образом, это будет исключать только поле id а не company_id
надеюсь, что это поможет всем, кто ищет решение.
рекомендуется указывать столбцы, которые вы запрашиваете, даже если вы запрашиваете все столбцы.
поэтому я бы предложил вам написать имя каждого столбца в инструкции (исключая тот, который вы не хотите).
Я согласен с» простым » решением перечисления всех столбцов, но это может быть обременительно, и опечатки могут вызвать много потерянного времени. Я использую функцию «getTableColumns» для получения имен моих столбцов, подходящих для вставки в запрос. Тогда все, что мне нужно сделать, это удалить те, которые я не хочу.
ваш результат возвращает строку с разделителями-запятыми, например.
столбец col1,и col2,с col3,col4. col53
Я согласен, что этого недостаточно для Select * , если тот, который вам не нужен, как упоминалось в другом месте, является каплей, вы не хотите, чтобы этот накладной полз.
Я бы создал посмотреть с необходимыми данными, то вы можете Select * в комфорт-если СУБД их поддерживает. В противном случае, поместите огромные данные в другую таблицу.
сначала я думал, что вы можете использовать регулярные выражения, но так как я читал MYSQL docs Кажется, вы не можете. На вашем месте я бы использовал другой язык (например, PHP) для создания списка столбцов, которые вы хотите получить, сохраните его как строку, а затем используйте ее для создания SQL.
затем отбросьте столбец на вашем любимом языке программирования: php
Я тоже этого хотел, поэтому вместо этого создал функцию.
Итак, как это работает, вы вводите таблицу, а затем столбец, который вы не хотите или как в массиве: array («id»,»name»,»whatevercolumn»)
поэтому в select вы можете использовать его следующим образом:
хотя я согласен с ответом Томаса (+1 ;)), я хотел бы добавить оговорку, что я буду считать столбец, что вы не want содержит едва ли какие-либо данные. Если он содержит огромное количество текста, xml или двоичных двоичных объектов, выделите каждый столбец по отдельности. Иначе пострадает ваше выступление. Ура!
да, хотя он может быть высоким I / O в зависимости от таблицы, вот обходной путь, который я нашел для него.
ответ написал Mahomedalid есть небольшая проблема:
внутри заменить код функции заменял» <columns_to_delete>, «by»», эта замена имеет проблему, если поле для замены является последним в строке concat из-за того, что последнее не имеет запятой char», » и не удаляется из строки.
замена <table> , <database> и
удаленный столбец заменяется строкой «FIELD_REMOVED» в моем дело в том, что я пытался сохранить память. (Поле, которое я удалял, является BLOB около 1 МБ)
основываясь на ответе @Mahomedalid, я сделал некоторые улучшения для поддержки «выберите все столбцы, кроме некоторых в mysql»
Если у вас есть много cols, используйте этот sql для изменения group_concat_max_len
может быть, у меня есть решение января Koritak это указал на несоответствие
стол :
Результат Запроса:
согласен с ответом @Mahomedalid. Но я не хотел делать что-то вроде подготовленного заявления, и я не хотел печатать все поля. Так что у меня было глупое решение. Перейдите в таблицу в phpmyadmin — >sql — >select, она сбрасывает копию запроса replace и готово! 🙂
Если это всегда один и тот же столбец, то вы можете создать представление, в котором его нет.
в противном случае, нет я так не думаю.
вы можете использовать SQL для создания SQL, если хотите, и оценить SQL, который он производит. Это общее решение, поскольку оно извлекает имена столбцов из информационной схемы. Вот пример из командной строки Unix.
- MYSQL с вашей командой mysql
- таблица с именем таблица
- EXCLUDEDFIELD с исключенным именем Поля
вам действительно нужно будет только извлечь имена столбцов таким образом, только один раз для создания списка столбцов исключается этот столбец, а затем просто используйте созданный запрос.
Теперь вы можете использовать $column_list строка в запросах, которые вы создаете.
Я хотел бы добавить еще одну точку зрения для того, чтобы решить эту проблему, особенно если у вас есть небольшое количество столбцов, чтобы удалить.
вы можете использовать инструмент DB, как MySQL Workbench чтобы сгенерировать оператор select для вас, вам просто нужно вручную удалить эти столбцы для сгенерированного оператора и скопировать его в сценарий SQL.
в MySQL Workbench способ его генерации:
щелкните правой кнопкой мыши по таблице — > отправить Редактор Sql — > Выбрать Все Инструкции.
Я довольно поздно на throing ответ для этого, положить это так, как я всегда это делал, и, честно говоря, его в 100 раз лучше и аккуратнее, чем лучший ответ, я только надеюсь, что кто-то это увидит. И найти его полезным
Select * — это SQL-антипаттерн. Он не должен использоваться в производственном коде по многим причинам, включая:
Это займет немного больше времени. Когда вещи запускаются миллионы раз, эти крошечные кусочки могут иметь значение. Медленная база данных, где медленность вызвана этим типом небрежного кодирования, является самым сложным для настройки производительности.
Это означает, что вы, вероятно, отправляете больше данных, чем вам нужно, что вызывает узкие места сервера и сети. Если у вас есть внутреннее соединение, шансы отправки большего количества данных, чем вам нужно, составляют 100%.
Это вызывает проблемы в обслуживании особенно, когда вы добавили новые столбцы, которые вы не хотите видеть везде. Далее, Если у вас есть новый столбец, вам может потребоваться что-то сделать с интерфейсом, чтобы определить, что делать с этим столбцом.
Он может разбивать представления (я знаю, что это правда в SQl server, это может быть или не быть правдой в mysql).
Если кто-то достаточно глуп, чтобы восстановить таблицы со столбцами в другом порядке (что вы не должны делать, но это происходит все время), все виды кода могут сломаться. Особенно кода для вставки, например, если вдруг вы ставите город в адрес_3 поле, потому что без указания, на базе может идти только на порядок столбцов. Это достаточно плохо, когда типы данных меняются, но хуже, когда замененные столбцы имеют один и тот же тип данных, потому что вы можете иногда вставлять плохие данные, которые беспорядок для очистки. Вы должны заботиться о целостности данных.
Если он используется во вставке, он сломает вставку, если новый столбец будет добавлен в одну таблицу, но не в другую.
Это может разрушить триггеры. Проблемы триггера может быть трудно диагностировать.
сложите все это против времени, необходимого для добавления имен столбцов (черт возьми, у вас даже может быть интерфейс, который позволяет перетаскивать имена столбцов (я знаю, что я делаю в SQL Server, я бы поспорил, что есть какой — то способ сделать это какой инструмент вы используете для написания запросов MySQL.) Давайте посмотрим: «я могу вызвать проблемы с обслуживанием, я могу вызвать проблемы с производительностью, и я могу вызвать проблемы с целостностью данных, но эй, я сэкономил пять минут времени разработки.»На самом деле просто поместите конкретные столбцы, которые вы хотите.
SQL все столбцы, кроме
Я хочу объединить эти две таблицы в столбце G. Однако, чтобы избежать дублирования столбцов (неоднозначный G). Я должен сделать запрос, как показано ниже.
Я уже использовал t1.*, чтобы попытаться избежать ввода имен всех столбцов из таблицы 1, однако мне все еще приходится вводить все столбцы EXCEPT для объединенного столбца G, что является полной катастрофой, если у вас есть таблица со многими столбцами.
Есть ли удобный способ, где мы можем это сделать
Я знаю, что могу распечатать все имена столбцов, а затем скопировать и вставить, однако запрос все еще слишком длинный для отладки, даже если мне не нужно вводить его вручную.
3 ответа
Как напечатать все столбцы, кроме последних 2? е.г input :echo FB_SYS_0032_I03_LTO3_idaen02r_02_20130820_181008 output : FB_SYS_0032_I03_LTO3_idaen02r_02 delimiter : _ (underscore)
Мне нужно выбрать все столбцы из таблицы ticket, кроме одного столбца depname Следующий prepared statement работает не так, как ожидалось. PREPARE stmt1 FROM ‘SELECT ? from magon.ticket limit 2’; select GROUP_CONCAT(COLUMN_NAME) into @clm from COLUMNS where TABLE_SCHEMA = ‘magon’ and TABLE_NAME =.
Обычно настоятельно не рекомендуется использовать SELECT * FROM в чем-либо, кроме специальных запросов для тестирования.
Причина в том, что схемы таблиц меняются, что может привести к нарушению кода, предполагающего наличие определенного столбца или порядок столбцов в таблице.
Даже если это делает ваш запрос довольно длинным, я бы предложил указать каждый столбец, который вы хотите вернуть в своем наборе данных.
Однако, чтобы ответить на ваш вопрос, нет никакого способа указать каждый столбец, кроме одного, в предложении SELECT..
Естественное соединение-это тип равносоединения, при котором возникает предикат соединения неявно путем сравнения всех столбцов в обеих таблицах, имеющих одинаковые имена столбцов в объединенных таблицах. Результирующая объединенная таблица содержит только один столбец для каждой пары столбцов с одинаковыми именами .
Пожалуйста, проверьте эту демо -версию .
Однако обратите внимание, что NATURAL JOIN s опасны и поэтому настоятельно не рекомендуют их использовать. Опасность возникает из-за непреднамеренного добавления нового столбца, названного так же, как и другой столбец в другой таблице.
Вы не можете сделать это автоматически (за исключением использования dynamic SQL). Но вы можете сэкономить много усилий, запросив информационные таблицы.
Вы можете получить список столбцов в двух таблицах, выполнив следующие действия:
Вы можете скопировать этот список в свой редактор SQL (или Excel), чтобы отформатировать запрос. Чтобы сделать это проще, вы даже можете сделать:
Это помещает все столбцы в одну строку, разделенную столбцами.
Похожие вопросы:
Я хочу выбрать все столбцы в таблице, кроме StudentAddress, и поэтому написал следующий запрос: select `(StudentAddress)?+.+` from student; Это дает следующую ошибку в клиенте Squirrel Sql.
Я попробовал следующий оператор SQL, но все равно получил выходные столбцы с именем, которое я хотел исключить. Что я здесь делаю не так? DECLARE @SQL AS VarChar(MAX) SET @SQL = » SELECT @SQL =.
Я хочу получить все столбцы, кроме одного столбца, может ли кто-нибудь помочь мне,как я могу получить результат, кроме как написать все имя столбца, потому что это хорошо для меньшего количества.
Как напечатать все столбцы, кроме последних 2? е.г input :echo FB_SYS_0032_I03_LTO3_idaen02r_02_20130820_181008 output : FB_SYS_0032_I03_LTO3_idaen02r_02 delimiter : _ (underscore)
Мне нужно выбрать все столбцы из таблицы ticket, кроме одного столбца depname Следующий prepared statement работает не так, как ожидалось. PREPARE stmt1 FROM ‘SELECT ? from magon.ticket limit 2’;.
Я использую asp.net и msaccess2003 и от 30 до 40 столбцов в моей таблице, я хочу выбрать все столбцы, но кроме конкретного столбца и не нуждаюсь в столбце, который я знаю при выполнении программы
есть ли способ выбрать все столбцы, кроме одного конкретного, который я не хочу выбирать? Я имею в виду, что иногда у меня возникает такая проблема, что в таблице есть сотни полей, и мне нужно.
У меня есть большое количество столбцов в PySpark dataframe, скажем, 200. Я хочу выбрать все столбцы, кроме, скажем, 3-4 столбцов. Как выбрать эти столбцы без необходимости вручную вводить имена.
При соединении двух таблиц я хотел бы выбрать все столбцы, кроме 2 из них, из большой таблицы со многими столбцами на pyspark sql в databricks. Мой pyspark sql: %sql set.
Привет, я хочу просмотреть все столбцы, кроме столбцов с Data_Type=image. Например. Ниже приведена информационная схема моей таблицы. Поэтому технически я хочу удалить столбцы с типом данных=image.
Как выбрать все столбцы таблицы, кроме одного столбца?
Как выбрать все столбцы таблицы, кроме одного столбца?
У меня есть почти 259 столбцов. Я не могу указать 258 столбцов в инструкции SELECT .
Есть ли другой способ сделать это?
Этот подход можно использовать для получения данных из всех столбцов, кроме одного: –
- Вставьте все данные во временную таблицу
- Затем отпустите столбец, который вы не хотите использовать во временной таблице
- Получить данные из временной таблицы (это не будет содержать данные удаленного столбца)
- Удалить временную таблицу
Что-то вроде этого:
Создайте представление. Да, в заявлении о создании представлений вам нужно будет перечислить каждое… и… каждое… поле… по… имени.
Затем просто select * from viewname после этого.
Вы можете получить данные имени столбца из таблицы sys.columns
Попробуйте выполнить следующий запрос:
Есть много доступных вариантов, один из которых:
Здесь col_x – это столбец, который вы не хотите включать в оператор select.
Без создания новой таблицы вы можете просто (например, с mysqli):
- получить все столбцы
- прокрутите все столбцы и удалите нужный вам
- сделайте свой запрос
Я просто хотел повторить комментарий @Luann, поскольку я всегда использую этот подход.
Просто щелкните правой кнопкой мыши по таблице> Таблица сценариев, как> Выбрать в> Новое окно запроса.
Вы увидите запрос выбора. Просто уберите столбец, который вы хотите исключить, и у вас есть предпочтительный запрос выбора.
В вашем случае разверните столбцы этой базы данных в проводнике объектов. Перетащите столбцы в область запроса.
А затем просто удалите один или два столбца, которые вы не хотите, а затем запустите. Я открыт для любых предложений легче, чем это.
Попробуйте выполнить следующий запрос:
Есть только один способ достичь этого имени. Другого метода не найдено. Вы должны перечислить все имена столбцов
Это не универсальное решение, но некоторые базы данных позволяют использовать регулярные выражения для указания столбцов.
Например, в случае Hive следующий запрос выбирает все столбцы, кроме ds и hr: