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

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

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

jarlh 17.04.2018 12:47
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
246
1
319 849
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Ответ принят как подходящий

Заключите имя столбца в квадратные скобки, например, from станет [от].

select [from] from table;

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

select table.[from] from table;

Что насчет: select TableName.from from TableName; PS: Работает в MySQL

Rudolf Real 10.09.2012 19:09

Я попробовал это только сегодня утром, и, похоже, это не сработало в моей установке MySQL. Это параметр или что-то, что его включает?

CodeChimp 03.10.2013 18:49

@CodeChimp - попробуйте использовать обратные кавычки, stackoverflow.com/questions/2901453/… Этот вопрос / ответ относится к MS SQL Server.

tvanfosson 03.10.2013 19:02

Верно, но @FabricioPH упомянул, что он работает в MySQL. Я попал сюда из поиска Google после того, как попробовал это на своей локальной установке MySQL. Я искал, существует ли общий способ ANSI SQL для экранирования подобных вещей в SQL. В настоящее время мы используем SQL Server 2005, но у нас также есть Oracle в некоторых других наших приложениях. Мы хотели бы закодировать наши Java DAO таким образом, чтобы, если бы нам когда-либо сказали перейти с SQL Server на что-то еще, это просто «сработало бы».

CodeChimp 03.10.2013 23:50

@CodeChimp Я могу сосчитать, сколько раз со мной такое случалось, без пальцев. :)

tvanfosson 04.10.2013 02:41

@FabricioPH Ваше решение записи tablename.columnname без квадратных скобок, похоже, не работает в SQL Server 2017. Однако использование квадратных скобок действительно работает.

MBak 31.08.2018 21:49

Если вы используете 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

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

banging 12.06.2013 23:03

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

select "from" from "table";

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

Двойные кавычки работают и для MS SQL, однако без учета регистра. Заключенные в кавычки идентификаторы - это просто, AFAIK, эквивалентная альтернатива идентификаторам, разделенным скобками.

P Daddy 15.11.2008 23:28

Двойные кавычки также работают для механизма запросов Presto SQL, который используется Amazon Athena.

Will Humphreys 22.08.2017 20:32

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

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.

Andriy M 15.01.2012 21:48

Что вы получаете от временной таблицы? Вроде совершенно бесполезно, вообще не при чем.

rjmunro 17.09.2013 15:46

@rjmunro, нет, это не кажется совершенно бесполезным. У меня есть случай, когда я запрашиваю табличный куб из SQL, и он возвращает имена столбцов, такие как «[Всего]». То есть само имя содержит «[» и «]». Вы не можете использовать [[Total]] и [Total] для получения такого столбца. Самый простой способ - поместить результат запроса во временную таблицу.

darlove 30.04.2019 13:13

@darlove Разве вы не можете использовать цитаты: "[Total]"? А может есть способ избежать этого, что-то вроде [\[Total\]]?

rjmunro 30.04.2019 13:34

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

darlove 01.05.2019 11:43

Привет, я работаю над системами 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, спасибо!

Paul 31.08.2019 03:11

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

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

Это можно сделать двумя способами:

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

SELECT `from` FROM TableName

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

SELECT TableName.from FROM TableName

Спасибо! Это спасло мой запрос листов Google, который пытался вытащить из столбца BY

Paul 25.09.2015 03:57

Спасибо, синтаксис двойных кавычек и квадратных скобок не работал с моим клиентом (MySQLWorkbench), но метод обратного тика работал.

jacob_g 12.07.2019 19:09

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

select `from` from table;

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

select [from] from <table>

Обратите внимание, что это не работает в MySQL.

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

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

Другие вопросы по теме