Jak radzić sobie z nazwami kolumn SQL, które wyglądają jak słowa kluczowe SQL?

226

Jedna z moich kolumn nazywa się from. Nie mogę zmienić nazwy, ponieważ tego nie zrobiłem. Czy mogę robić coś takiego, SELECT from FROM TableNameczy istnieje specjalna składnia, aby uniknąć pomyłki w SQL Server?

Nathan H.
źródło
3
Powiedziałbym, że używaj podwójnych cudzysłowów ANSI SQL dla ograniczników. Będzie działać na prawie wszystkich dbms, w tym SQL Server. Po prostu rób SELECT "from" FROM TableName, miło i przenośnie!
jarlh

Odpowiedzi:

354

Zawiń nazwę kolumny w nawiasy kwadratowe tak, fromstaje się [z]

select [from] from table;

Możliwe jest również użycie następujących (przydatne przy zapytaniach do wielu tabel):

select table.[from] from table;
tvanfosson
źródło
10
Co z: select TableName.from from TableName; PS: Działa w MySQL
Fabricio PH
1
Próbowałem tego właśnie dziś rano i nie działało to w mojej instalacji MySQL. Czy to parametr, czy coś, co go włącza?
CodeChimp
@CodeChimp - spróbuj użyć backticks, stackoverflow.com/questions/2901453/… To pytanie / odpowiedź dotyczy MS SQL Server.
tvanfosson
Zgadza się, ale @FabricioPH wspomniało, że działa w MySQL. Spotkałem się tutaj z wyszukiwarki Google po wypróbowaniu tego na mojej lokalnej instalacji MySQL. Chciałem sprawdzić, czy istnieje ogólny sposób ucieczki ANSI SQL przed takimi rzeczami w SQL. Obecnie używamy SQL Server 2005, ale w niektórych naszych aplikacjach mamy również Oracle. Chcielibyśmy kodować nasze Java DAO w taki sposób, aby gdyby kiedykolwiek kazano nam przejść z SQL Servera na coś innego, to po prostu „działałoby”.
CodeChimp
@CodeChimp Potrafię policzyć, ile razy zdarzyło mi się to bez palców. :)
tvanfosson
25

Jeśli był w PostgreSQL, użyj podwójnych cudzysłowów wokół nazwy, takich jak:

select "from" from "table";

Uwaga: wewnętrznie PostgreSQL automatycznie konwertuje wszystkie niecytowane polecenia i parametry na małe litery. Powoduje to, że polecenia i identyfikatory nie rozróżniają wielkości liter. WYBÓR * z tabeli; jest interpretowany jako select * z tabeli; . Jednak parametry wewnątrz podwójnych cudzysłowów są używane tak, jak są, i dlatego JEST rozróżniana wielkość liter: wybierz * z „tabeli”; i wybierz * z „Tabeli”; pobiera wynik z dwóch różnych tabel.

trochę
źródło
Podwójne cudzysłowy działają również w MS SQL, bez rozróżniania wielkości liter. Cytowane identyfikatory są po prostu, AFAIK, równoważną alternatywą dla identyfikatorów rozdzielanych nawiasami.
P Daddy,
Podwójne cudzysłowy działa również w silniku zapytań Presto SQL używanym przez Amazon Athena.
Will Humphreys,
21

Podczas gdy to robisz - alias to coś innego (lub jeszcze lepiej, użyj widoku lub SP i przestań używać starej metody bezpośredniego dostępu).

SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName
Cade Roux
źródło
14

Są dwa sposoby, aby to zrobić:

  1. Użyj cytatu, jak tutaj:

Wybierz `from` FROM TableName

  1. Możesz podać nazwę tabeli jako:

SELECT TableName.from FROM TableName

Sunil Kapil
źródło
Dzięki! To zapisało moje zapytanie w arkuszach google, które próbowało wyciągnąć z kolumny BY
Paul
1
Dzięki, składnia podwójnych cudzysłowów i nawiasów kwadratowych nie działała z moim klientem (MySQLWorkbench), ale zadziałała metoda back tick.
kingInTheNorth
10

Odpowiedź na twoje pytanie wydaje się być tutaj dobrze udzielona, ​​ale chcę dodać jeszcze jeden komentarz do tego tematu.

Osoby projektujące bazę danych powinny mieć świadomość zarezerwowanych słów kluczowych i unikać ich używania. Jeśli odkryjesz, że ktoś go używa, poinformuj go o tym (uprzejmie). Słowo kluczowe jest tutaj słowem zastrzeżonym .

Więcej informacji:

„Zastrzeżone słowa kluczowe nie powinny być używane jako nazwy obiektów. Bazy danych zaktualizowane z wcześniejszych wersji SQL Server mogą zawierać identyfikatory zawierające słowa niezarezerwowane we wcześniejszej wersji, ale są to słowa zastrzeżone dla bieżącej wersji SQL Server. sprzeciwiać się, używając identyfikatorów rozdzielanych do momentu zmiany nazwy. ” http://msdn.microsoft.com/en-us/library/ms176027.aspx

i

„Jeśli Twoja baza danych zawiera nazwy pasujące do zarezerwowanych słów kluczowych, musisz odwoływać się do tych identyfikatorów z ogranicznikami. Aby uzyskać więcej informacji, zobacz Identyfikatory (DMX).” http://msdn.microsoft.com/en-us/library/ms132178.aspx

Eigir
źródło
2
Jeszcze lepiej ZAWSZE używaj nawiasów dla obiektów bazy danych.
walenie
8

Jeśli korzystasz z programu SQL Server, możesz po prostu owinąć nawiasy kwadratowe wokół nazwy kolumny lub tabeli.

select [select]
from [table]
John Baughman
źródło
5

W Apache Drill użyj cudzysłowów:

select `from` from table;
Kun Wu
źródło
3

Zmierzyłem się również z tym problemem. Rozwiązaniem tego jest umieszczenie w zapytaniu [nazwa_kolumny] w ten sposób.

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

Więc będzie działać idealnie dobrze.

Muneeb Hassan
źródło
3

Cześć. Pracuję na systemach Teradata, które są całkowicie zgodne z ANSI. Użyj podwójnych cudzysłowów „”, aby nazwać takie kolumny.

Np. typeJest słowem kluczowym zastrzeżonym SQL, a używane w cudzysłowie typejest traktowane jako nazwa określona przez użytkownika.

Zobacz poniższy przykład kodu:

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
drapieżnik
źródło
Potwierdzam, że działa w DBeaver z bazą danych Teradata, dzięki!
Paul
1

Możesz umieścić nazwę kolumny w nawiasie, np .:

Select  [from] from < ur_tablename>

Lub

Umieść tabelę tymczasową, a następnie używaj, jak chcesz.
Przykład:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Tutaj zakładam, że twoja_nazwa_tablicy zawiera tylko jedną kolumnę (tj. Z).

użytkownik247487
źródło
3
Zakłada się, że [from]jest to jedyna kolumna, która your_tablenamema.
Andriy M
Co zyskujesz z tymczasowego stołu? Wydaje się całkowicie bezużyteczne, w ogóle nie ma nic wspólnego z pytaniem.
rjmunro
@ rjmunro, nie, to nie wydaje się całkowicie bezużyteczne. Mam przypadek, w którym odpytuję tabelaryczną kostkę z SQL i zwraca ona nazwy kolumn, takie jak „[Razem]”. Oznacza to, że sama nazwa zawiera „[” i „]”. Nie można użyć [[Razem]] i [Razem], aby pobrać taką kolumnę. Najprostszym sposobem jest umieszczenie wyniku zapytania w tabeli tymczasowej.
darlove
@darlove nie można używać cytatów: "[Total]"? A może jest jakiś sposób na ucieczkę [\[Total\]]?
rjmunro
@ rjmunro, po odrobinie eksperymentowania z tym znalazłem inny sposób, o którym nie wiedziałem: możesz ustawić QUOTED_IDENTIFIER na ON, a następnie użyć tego, o czym mówisz, podwójnego cudzysłowu ". Więc to tylko kolejny sposób, ale nie
odrzuciłbym
1

Wystąpił ten sam problem podczas próby aktualizacji kolumny, której nazwa była słowem kluczowym . Powyższe rozwiązanie nie pomogło mi. Rozwiązałem to, podając po prostu nazwę tabeli w następujący sposób:

UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')
Fabricio PH
źródło
1

Następujące będą działać idealnie:

SELECT DISTINCT table.from AS a FROM table
użytkownik3797709
źródło
1

W MySQL zamiast alternatywnych cudzysłowów (`) można użyć interfejsu użytkownika do zmiany nazw kolumn. Kliknij prawym przyciskiem myszy tabelę> Zmień tabelę> Edytuj nazwę kolumny zawierającą słowo kluczowe sql> Zatwierdź.

select [from] from <table>

Uwaga: powyższe nie działa w MySQL

Ania
źródło
1

Sądząc po odpowiedziach tutaj i moim własnym doświadczeniu. Jedyną akceptowalną odpowiedzią, jeśli planujesz być przenośny, nie używaj słów kluczowych SQL dla nazw tabel, kolumn lub innych nazw.

Wszystkie te odpowiedzi działają w różnych bazach danych, ale najwyraźniej wiele nie obsługuje rozwiązania ANSI.

David Bradley
źródło