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

226

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

Натан Х
источник
3
Я бы сказал, использовать двойные кавычки ANSI SQL для идентификаторов с разделителями. Он будет работать практически на любой базе данных, включая SQL Server. Т.е. просто делай SELECT "from" FROM TableName, красиво и портативно!
Джарл

Ответы:

355

Оберните имя столбца в скобки, например, fromстановится [из].

select [from] from table;

Также можно использовать следующее (полезно при запросе нескольких таблиц):

select table.[from] from table;
tvanfosson
источник
10
Как насчет: select TableName.from from TableName; PS: Это работает в MySQL
Fabricio PH
1
Я попробовал это только сегодня утром, и это не сработало в моей установке MySQL. Это параметр или что-то, что его включает?
CodeChimp
@CodeChimp - попробуйте использовать обратные метки, stackoverflow.com/questions/2901453/… Этот вопрос / ответ относится только к MS SQL Server.
tvanfosson
Правильно, но @FabricioPH упомянул, что работает в MySQL. Я попал сюда из поиска Google после того, как попробовал это на моей локальной установке MySQL. Я искал, чтобы увидеть, существует ли общий способ ANSI SQL для экранирования подобных вещей в SQL. В настоящее время мы используем SQL Server 2005, но у нас также есть Oracle в некоторых других наших приложениях. Мы хотели бы закодировать наши Java DAO таким образом, чтобы, если бы нам когда-нибудь сказали перейти с SQL Server на что-то другое, он просто «работал».
CodeChimp
@CodeChimp Я могу сосчитать, сколько раз это случилось со мной без пальцев. :)
tvanfosson
25

Если это было в PostgreSQL, используйте двойные кавычки вокруг имени, например:

select "from" from "table";

Примечание. Внутри PostgreSQL автоматически преобразует все команды и параметры без кавычек в нижний регистр. Это приводит к тому, что команды и идентификаторы не чувствительны к регистру. ВЫБРАТЬ * из ТАБЛИЦЫ; интерпретируется как select * from table; , Однако параметры внутри двойных кавычек используются как есть, и поэтому учитывают регистр: select * from "table"; и выберите * из «Таблицы»; получает результат из двух разных таблиц.

некоторые
источник
Двойные кавычки работают и для MS SQL, но без учета регистра. Заключенные в кавычки идентификаторы - это просто AFAIK, эквивалентная альтернатива идентификаторам, разделенным скобками.
P Daddy
Двойные кавычки также работают для механизма запросов Presto SQL, используемого Amazon Athena.
Уилл Хамфрис
21

Пока вы это делаете - создайте псевдоним как-то еще (или, что еще лучше, используйте представление или SP и не используйте старый метод прямого доступа).

SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName
Кейд Ру
источник
14

Это два способа сделать это:

  1. Используйте обратную цитату, как здесь:

SELECT `from` FROM TableName

  1. Вы можете упомянуть с именем таблицы как:

SELECT TableName.from FROM TableName

Сунил Капил
источник
Спасибо! Это сохранило мой запрос на листы Google, который пытался извлечь из столбца BY
Пол
1
Спасибо, синтаксис с двойными кавычками и квадратными скобками не работал с моим клиентом (MySQLWorkbench), но метод обратного тика сработал.
kingInTheNorth
10

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

Те, кто проектирует базу данных, должны хорошо знать зарезервированные ключевые слова и избегать их использования. Если вы обнаружите, что кто-то использует его, сообщите ему об этом (вежливо). Ключевым словом здесь является зарезервированное слово.

Больше информации:

«Зарезервированные ключевые слова не должны использоваться в качестве имен объектов. Базы данных, обновленные с более ранних версий SQL Server, могут содержать идентификаторы, которые включают слова, не зарезервированные в более ранней версии, но которые являются зарезервированными словами для текущей версии SQL Server. Вы можете обратиться к объект с помощью идентификаторов с разделителями, пока имя не может быть изменено. " http://msdn.microsoft.com/en-us/library/ms176027.aspx

и

«Если ваша база данных содержит имена, которые соответствуют зарезервированным ключевым словам, вы должны использовать идентификаторы с разделителями при обращении к этим объектам. Для получения дополнительной информации см. Идентификаторы (DMX)». http://msdn.microsoft.com/en-us/library/ms132178.aspx

Eigir
источник
2
Еще лучше ВСЕГДА использовать скобки для объектов базы данных.
стук
8

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

select [select]
from [table]
Джон Боугман
источник
5

В Apache Drill используйте обратные кавычки:

select `from` from table;
Кун Ву
источник
3

Я тоже сталкивался с этой проблемой. И решение для этого состоит в том, чтобы поместить [Column_Name] как это в запросе.

string query= "Select [Name],[Email] from Person";

Так что это будет работать на отлично.

Муниб Хасан
источник
3

Привет, я работаю на системах 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
preyingrazor
источник
Я подтверждаю, что это работает в DBeaver с базой данных Teradata, спасибо!
Пол
1

Вы можете поместить название столбца в скобки, например:

Select  [from] from < ur_tablename>

Или

Положите в таблицу времен, затем используйте, как вам нравится.
Пример:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Здесь я просто предполагаю, что your_tablename содержит только один столбец (т.е. from).

user247487
источник
3
Это предполагает, что [from]это единственный столбец, your_tablenameкоторый получил.
Андрей М
Что вы получаете от временной таблицы? Это кажется совершенно бесполезным, не имеет ничего общего с вопросом.
Rjmunro
@ rjmunro, нет, это не кажется абсолютно бесполезным. У меня есть случай, когда я запрашиваю табличный куб из SQL, и он возвращает имена столбцов, таких как «[Всего]». То есть само имя содержит «[» и «]». Вы не можете использовать [[Всего]] и [Всего], чтобы получить такой столбец. Самый простой способ - поместить результат запроса во временную таблицу.
darlove
@darlove вы не можете использовать кавычки: "[Total]"? Или, может быть, есть способ избежать этого, что-то вроде [\[Total\]]?
19
@rjmunro, немного поэкспериментировав с этим, я нашел другой способ, о котором я не знал: вы можете установить для QUOTED_IDENTIFIER значение ON, а затем использовать то, о чем вы говорите, двойную кавычку ". Так что это просто еще один кстати, но я бы не стал полностью отказываться от выбора временного стола
Дарлов
1

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

UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')
Fabricio PH
источник
1

Следующее будет работать отлично:

SELECT DISTINCT table.from AS a FROM table
user3797709
источник
1

В MySQL, в отличие от использования обратных кавычек (`), вы можете использовать пользовательский интерфейс для изменения имен столбцов. Щелкните правой кнопкой мыши таблицу> Изменить таблицу> Изменить имя столбца, содержащее ключевое слово sql> Фиксация.

select [from] from <table>

Как примечание, выше не работает в MySQL

Анна
источник
1

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

Все эти ответы работают в разных базах данных, но, очевидно, многие из них не поддерживают решение ANSI.

Дэвид Брэдли
источник