Одна из моих колонок называется from. Я не могу изменить имя, потому что не успел.
Могу ли я делать что-то вроде SELECT from FROM TableName или есть специальный синтаксис, чтобы избежать путаницы с SQL Server?


Заключите имя столбца в квадратные скобки, например, from станет [от].
select [from] from table;
Также можно использовать следующее (полезно при запросе нескольких таблиц):
select table.[from] from table;
Что насчет: select TableName.from from TableName; PS: Работает в MySQL
Я попробовал это только сегодня утром, и, похоже, это не сработало в моей установке MySQL. Это параметр или что-то, что его включает?
@CodeChimp - попробуйте использовать обратные кавычки, stackoverflow.com/questions/2901453/… Этот вопрос / ответ относится к MS SQL Server.
Верно, но @FabricioPH упомянул, что он работает в MySQL. Я попал сюда из поиска Google после того, как попробовал это на своей локальной установке MySQL. Я искал, существует ли общий способ ANSI SQL для экранирования подобных вещей в SQL. В настоящее время мы используем SQL Server 2005, но у нас также есть Oracle в некоторых других наших приложениях. Мы хотели бы закодировать наши Java DAO таким образом, чтобы, если бы нам когда-либо сказали перейти с SQL Server на что-то еще, это просто «сработало бы».
@CodeChimp Я могу сосчитать, сколько раз со мной такое случалось, без пальцев. :)
@FabricioPH Ваше решение записи tablename.columnname без квадратных скобок, похоже, не работает в SQL Server 2017. Однако использование квадратных скобок действительно работает.
Если вы используете SQL Server, вы можете просто заключить в квадратные скобки имя столбца или таблицы.
select [select]
from [table]
Пока вы это делаете - назовите это чем-то другим (или еще лучше, используйте представление или SP и не рекомендуйте старый метод прямого доступа).
SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName
Кажется, здесь на ваш вопрос дан хороший ответ, но я просто хочу добавить еще один комментарий к этой теме.
Разработчики базы данных должны хорошо знать зарезервированные ключевые слова и избегать их использования. Если вы обнаружите, что кто-то его использует, сообщите им об этом (вежливо). Ключевое слово здесь - слово зарезервированный.
Больше информации:
"Reserved keywords should not be used as object names. Databases upgraded from earlier versions of SQL Server may contain identifiers that include words not reserved in the earlier version, but that are reserved words for the current version of SQL Server. You can refer to the object by using delimited identifiers until the name can be changed." http://msdn.microsoft.com/en-us/library/ms176027.aspx
и
"If your database does contain names that match reserved keywords, you must use delimited identifiers when you refer to those objects. For more information, see Identifiers (DMX)." http://msdn.microsoft.com/en-us/library/ms132178.aspx
А еще лучше ВСЕГДА используйте скобки для объектов вашей базы данных.
Если это было в PostgreSQL, используйте двойные кавычки вокруг имени, например:
select "from" from "table";
Примечание: внутри PostgreSQL автоматически преобразует все не заключенные в кавычки команды и параметры в нижний регистр. В результате команды и идентификаторы не чувствительны к регистру. ВЫБОР * ИЗ ТАБЛИЦЫ; интерпретируется как выберите * из таблицы;. Однако параметры внутри двойных кавычек используются как есть, и поэтому они чувствительны к регистру: выберите * из «таблицы»; и выберите * из «Таблицы»; получают результат из двух разных таблиц.
Двойные кавычки работают и для MS SQL, однако без учета регистра. Заключенные в кавычки идентификаторы - это просто, AFAIK, эквивалентная альтернатива идентификаторам, разделенным скобками.
Двойные кавычки также работают для механизма запросов Presto SQL, который используется Amazon Athena.
Вы можете указать имя столбца в скобках, например:
Select [from] from < ur_tablename>
Или же
Поместите временную таблицу и используйте как хотите. Пример:
Declare @temp_table table(temp_from varchar(max))
Insert into @temp_table
Select * from your_tablename
Здесь я просто предполагаю, что your_tablename содержит только один столбец (т.е. from).
Это предполагает, что [from] - единственный столбец, который есть у your_tablename.
Что вы получаете от временной таблицы? Вроде совершенно бесполезно, вообще не при чем.
@rjmunro, нет, это не кажется совершенно бесполезным. У меня есть случай, когда я запрашиваю табличный куб из SQL, и он возвращает имена столбцов, такие как «[Всего]». То есть само имя содержит «[» и «]». Вы не можете использовать [[Total]] и [Total] для получения такого столбца. Самый простой способ - поместить результат запроса во временную таблицу.
@darlove Разве вы не можете использовать цитаты: "[Total]"? А может есть способ избежать этого, что-то вроде [\[Total\]]?
@rjmunro, немного поэкспериментировав с этим, я нашел другой способ, о котором я не знал: вы можете установить QUOTED_IDENTIFIER в положение ON, а затем использовать то, о чем вы говорите, двойные кавычки ". Итак, это просто еще один способ, но я бы не стал полностью отказываться от опции временной таблицы.
Привет, я работаю над системами Teradata, полностью совместимыми с ANSI. Для именования таких столбцов используйте двойные кавычки "".
Например. type - это зарезервированное ключевое слово SQL, и при использовании в кавычках type рассматривается как имя, указанное пользователем.
См. Ниже пример кода:
CREATE TABLE alpha1
AS
(
SEL
product1
type_of_product AS "type"
FROM beta1
) WITH DATA
PRIMARY INDEX (product1)
--type is a SQL reserved keyword
TYPE
--see? now to retrieve the column you would use:
SEL "type" FROM alpha1
Я подтверждаю, что это работает в DBeaver с базой данных Teradata, спасибо!
Я столкнулся с той же проблемой при попытке Обновить столбца с именем ключевое слово. Приведенное выше решение мне не помогло. Я решил это, просто указав имя таблицы следующим образом:
UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')
Я тоже столкнулся с этой проблемой. И решение для этого - поместить в запрос [Column_Name] вот так.
string query= "Select [Name],[Email] from Person";
Так что он будет работать отлично.
Следующее будет отлично работать:
SELECT DISTINCT table.from AS a FROM table
Это можно сделать двумя способами:
SELECT `from` FROM TableName
SELECT TableName.from FROM TableName
Спасибо! Это спасло мой запрос листов Google, который пытался вытащить из столбца BY
Спасибо, синтаксис двойных кавычек и квадратных скобок не работал с моим клиентом (MySQLWorkbench), но метод обратного тика работал.
В Apache Drill используйте обратные кавычки:
select `from` from table;
В MySQL вместо использования обратных кавычек (`) вы можете использовать пользовательский интерфейс для изменения имен столбцов. Щелкните правой кнопкой мыши таблицу> Изменить таблицу> Отредактируйте имя столбца, содержащее ключевое слово sql> Зафиксировать.
select [from] from <table>
Обратите внимание, что это не работает в MySQL.
Судя по ответам здесь и по моему собственному опыту. Единственный приемлемый ответ, если вы планируете переносимость, - не использовать ключевые слова SQL для имен таблиц, столбцов или других имен.
Все эти ответы работают в различных базах данных, но, по-видимому, многие из них не поддерживают решение ANSI.
Я бы сказал, используйте двойные кавычки ANSI SQL для идентификаторов с разделителями. Он будет работать практически с любыми СУБД, включая SQL Server. Т.е. просто сделать
SELECT "from" FROM TableName, красивый и портативный!