Як поводитися з іменами стовпців SQL, схожими на ключові слова SQL?


226

Один з моїх стовпців називається from. Я не можу змінити ім'я, тому що не встиг. Чи дозволено мені робити щось на кшталт SELECT from FROM TableNameабо є спеціальний синтаксис, щоб уникнути плутанини SQL Server?


3
Я б сказав, використовуйте подвійні лапки ANSI SQL для розмежованих ідентифікаторів. Він буде працювати майже на будь-яких dbms, включаючи SQL Server. Тобто просто робити SELECT "from" FROM TableName, приємно і портативно!
jarlh

Відповіді:


354

Загорніть назву стовпця в дужки так, fromстає [з].

select [from] from table;

Можливо також використовувати наступне (корисно при запиті декількох таблиць):

select table.[from] from table;

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 * від tAblE; інтерпретується як select * з таблиці; . Однак параметри всередині подвійних лапок використовуються як є, і тому ARE чутливі до регістру: виберіть * з "таблиці"; і виберіть * із "Таблиці"; отримує результат з двох різних таблиць.


Подвійні лапки також працюють для MS SQL, без чутливості регістру. Цитовані ідентифікатори - це просто AFAIK, еквівалентна альтернатива ідентифікаторам з обмеженими дужками.
P тато

Подвійні лапки також працюють для механізму запитів Presto SQL, який використовує Афіна Amazon.
Вілл Хамфріс

21

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

SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName

14

Це два способи зробити це:

  1. Використовуйте цитату назад:

ВИБІРТИ `від` ІЗ Таблиці

  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


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

Я підтверджую, що це працює в DBeaver із базою даних Teradata, дякую!
Пол,

1

Ви можете вказати назву стовпця в дужці, наприклад:

Select  [from] from < ur_tablename>

Або

Помістіть у темпрарі таблицю, а потім використовуйте, як вам подобається.
Приклад:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Тут я просто припускаю, що ваше_таблиця містить лише один стовпець (тобто з).


3
Це передбачає, що [from]це єдиний стовпець, your_tablenameякий потрапив.
Андрій М

Що ви отримуєте від тимчасового столу? Це здається абсолютно марним, взагалі нічого спільного з питанням.
rjmunro

@rjmunro, ні, це не здається абсолютно марним. У мене є випадок, коли я запитую табличний куб від SQL, і він повертає назви стовпців типу "[Всього]." Тобто, сама назва містить '[' і ']'. Ви не можете використовувати [[Всього]] та [Усього] для отримання такого стовпця. Найпростіший спосіб - помістити результат запиту в темпну таблицю.
darlove

@darlove Ви не можете використовувати лапки "[Total]":? А може, є спосіб уникнути цього, щось на кшталт [\[Total\]]?
rjmunro

@rjmunro, трохи експериментуючи з цим, я знайшов інший спосіб, про який я не знав: ви можете встановити QUOTED_IDENTIFIER на ON і потім використовувати те, що ви говорите, подвійну цитату ". Отже, це просто інший шлях , але я б не відкидати варіант тимчасової таблиці повністю.
darlove

1

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

UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')


1

У MySQL, замість використання зворотних лапок (`), ви можете використовувати інтерфейс користувача для зміни назв стовпців. Клацніть правою кнопкою миші таблицю> Змінити таблицю> Редагувати назву стовпця, що містить ключове слово sql> Здійснити.

select [from] from <table>

Як зауваження, вищевикладене не працює в MySQL


1

Судячи з відповідей тут і власного досвіду. Єдина прийнятна відповідь, якщо ви плануєте переносити портатив, це не використовувати ключові слова SQL для таблиці, стовпців чи інших імен.

Усі ці відповіді працюють у різних базах даних, але, мабуть, багато хто не підтримує рішення ANSI.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.