Wie gehe ich mit SQL-Spaltennamen um, die wie SQL-Schlüsselwörter aussehen?


224

Eine meiner Spalten heißt from. Ich kann den Namen nicht ändern, weil ich es nicht geschafft habe. Darf ich so etwas tun SELECT from FROM TableNameoder gibt es eine spezielle Syntax, um zu vermeiden, dass der SQL Server verwirrt wird?


3
Ich würde sagen, verwenden Sie die doppelten Anführungszeichen von ANSI SQL für begrenzte Bezeichner. Es funktioniert auf fast allen DBMS, einschließlich SQL Server. Dh einfach SELECT "from" FROM TableName, schön und tragbar!
Jarlh

Antworten:


353

Schließen Sie den Spaltennamen wie folgt in Klammern ein und fromwird zu [von].

select [from] from table;

Es ist auch möglich, Folgendes zu verwenden (nützlich beim Abfragen mehrerer Tabellen):

select table.[from] from table;

10
Was ist mit: select TableName.from from TableName; PS: Es funktioniert in MySQL
Fabricio PH

1
Ich habe es erst heute Morgen versucht und es schien in meiner MySQL-Installation nicht zu funktionieren. Ist es ein Parameter oder etwas, das ihn einschaltet?
CodeChimp

@CodeChimp - versuchen Sie es mit Backticks, stackoverflow.com/questions/2901453/… Diese Frage / Antwort ist spezifisch für MS SQL Server.
Tvanfosson

Richtig, aber @FabricioPH hat erwähnt, dass es in MySQL funktioniert. Ich habe hier eine Google-Suche durchgeführt, nachdem ich dies bei meiner lokalen MySQL-Installation versucht habe. Ich habe nach einer generischen ANSI-SQL-Methode gesucht, um solchen Dingen in SQL zu entkommen. Wir verwenden derzeit SQL Server 2005, aber wir haben auch Oracle in einigen unserer anderen Apps. Wir möchten unsere Java-DAOs so codieren, dass es einfach "funktioniert", wenn uns jemals gesagt wird, dass wir von SQL Server zu etwas anderem wechseln sollen.
CodeChimp

@CodeChimp Ich kann zählen, wie oft mir nichts passiert ist. :)
Tvanfosson

25

Wenn es in PostgreSQL war, verwenden Sie doppelte Anführungszeichen um den Namen, wie:

select "from" from "table";

Hinweis: Intern konvertiert PostgreSQL automatisch alle nicht zitierten Befehle und Parameter in Kleinbuchstaben. Dies hat zur Folge, dass Befehle und Bezeichner nicht zwischen Groß- und Kleinschreibung unterscheiden. sEleCt * von tAblE; wird als select * from table interpretiert ; . Parameter in doppelten Anführungszeichen werden jedoch unverändert verwendet und unterscheiden daher zwischen Groß- und Kleinschreibung: Wählen Sie * aus "Tabelle" aus. und wählen Sie * aus "Tabelle"; Ruft das Ergebnis aus zwei verschiedenen Tabellen ab.


Die doppelten Anführungszeichen funktionieren jedoch auch für MS SQL ohne Berücksichtigung der Groß- und Kleinschreibung. Zitierte Bezeichner sind nur AFAIK, eine äquivalente Alternative zu durch Klammern getrennten Bezeichnern.
P Daddy

Doppelte Anführungszeichen funktionieren auch für die Presto SQL-Abfrage-Engine, wie sie von Athena von Amazon verwendet wird.
Will Humphreys

21

Während Sie es tun - alias es als etwas anderes (oder noch besser, verwenden Sie eine Ansicht oder einen SP und verwerfen Sie die alte Direktzugriffsmethode).

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

14

Dies sind die beiden Möglichkeiten:

  1. Verwenden Sie das Rückzitat wie hier:

SELECT `from` FROM TableName

  1. Sie können mit Tabellennamen Folgendes erwähnen:

SELECT TableName.from FROM TableName


Vielen Dank! Dies speicherte meine Google Sheets-Abfrage, die versuchte, aus der Spalte BY
Paul

1
Vielen Dank, die Syntax mit doppelten Anführungszeichen und eckigen Klammern funktionierte bei meinem Client (MySQLWorkbench) nicht, aber bei der Back-Tick-Methode.
kingInTheNorth

10

Ihre Frage scheint hier gut beantwortet zu sein, aber ich möchte diesem Thema nur noch einen Kommentar hinzufügen.

Diejenigen, die die Datenbank entwerfen, sollten die reservierten Schlüsselwörter gut kennen und deren Verwendung vermeiden. Wenn Sie jemanden entdecken, der es benutzt, informieren Sie ihn darüber (auf höfliche Weise). Das Schlüsselwort hier ist reserviertes Wort.

Mehr Informationen:

"Reservierte Schlüsselwörter sollten nicht als Objektnamen verwendet werden. Datenbanken, die von früheren Versionen von SQL Server aktualisiert wurden, enthalten möglicherweise Bezeichner, die Wörter enthalten, die in der früheren Version nicht reserviert waren, die jedoch für die aktuelle Version von SQL Server reserviert sind Objekt durch begrenzte Trennzeichen, bis der Name geändert werden kann. " http://msdn.microsoft.com/en-us/library/ms176027.aspx

und

"Wenn Ihre Datenbank Namen enthält, die mit reservierten Schlüsselwörtern übereinstimmen, müssen Sie begrenzte Bezeichner verwenden, wenn Sie auf diese Objekte verweisen. Weitere Informationen finden Sie unter Bezeichner (DMX)." http://msdn.microsoft.com/en-us/library/ms132178.aspx


2
Besser noch, verwenden Sie IMMER Klammern für Ihre Datenbankobjekte.
Schlagen

8

Wenn Sie SQL Server verwenden, können Sie einfach die eckigen Klammern um den Spalten- oder Tabellennamen setzen.

select [select]
from [table]

5

Verwenden Sie in Apache Drill Backquotes:

select `from` from table;

3

Ich habe mich auch diesem Problem gestellt. Die Lösung hierfür besteht darin, [Column_Name] wie folgt in die Abfrage einzufügen.

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

Es wird also perfekt funktionieren.


3

Hallo, ich arbeite an Teradata-Systemen, die vollständig ANSI-kompatibel sind. Verwenden Sie doppelte Anführungszeichen, um solche Spalten zu benennen.

ZB typeist ein reserviertes SQL-Schlüsselwort und wird bei Verwendung in Anführungszeichen typeals benutzerdefinierter Name behandelt.

Siehe untenstehendes Codebeispiel:

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

Ich bestätige, dass dies in DBeaver mit Teradata-Datenbank funktioniert, danke!
Paul

1

Sie können Ihren Spaltennamen wie folgt in Klammern setzen:

Select  [from] from < ur_tablename>

Oder

Legen Sie eine temporäre Tabelle ein und verwenden Sie sie nach Belieben.
Beispiel:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Hier gehe ich einfach davon aus, dass Ihr Tabellenname nur eine Spalte enthält (dh von).


3
Das setzt voraus, dass dies [from]die einzige Spalte ist, die es your_tablenamegibt.
Andriy M

Was gewinnen Sie aus der temporären Tabelle? Es scheint völlig nutzlos, überhaupt nichts mit der Frage zu tun.
rjmunro

@rjmunro, nein, das scheint nicht völlig nutzlos. Ich habe einen Fall, in dem ich einen tabellarischen Cube aus SQL abfrage und er Namen von Spalten wie '[Total]' zurückgibt. Das heißt, der Name selbst enthält '[' und ']'. Sie können [[Total]] und [Total] nicht verwenden, um eine solche Spalte abzurufen. Am einfachsten ist es, das Ergebnis der Abfrage in eine temporäre Tabelle zu schreiben.
Liebling

@darlove Kannst du keine Anführungszeichen verwenden : "[Total]"? Oder gibt es vielleicht einen Weg, dem zu entkommen [\[Total\]]?
rjmunro

@rjmunro, nachdem ich ein wenig damit experimentiert habe, habe ich einen anderen Weg gefunden, von dem ich nichts wusste: Sie können QUOTED_IDENTIFIER auf ON setzen und dann das verwenden, wovon Sie sprechen, das doppelte Anführungszeichen ". Also, es ist nur ein anderer übrigens, aber ich würde die temporäre Tabellenoption nicht vollständig verwerfen.
Liebling

1

Ich habe das gleiche Problem ausgeführt, als ich versucht habe, eine Spalte zu aktualisieren , deren Name ein Schlüsselwort war . Die obige Lösung hat mir nicht geholfen. Ich habe es gelöst, indem ich einfach den Namen der Tabelle wie folgt angegeben habe:

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

1

Folgendes wird perfekt funktionieren:

SELECT DISTINCT table.from AS a FROM table

1

In MySQL können Sie alternativ zur Verwendung von Anführungszeichen (`) die Benutzeroberfläche verwenden, um Spaltennamen zu ändern. Klicken Sie mit der rechten Maustaste auf die Tabelle> Tabelle ändern> Bearbeiten Sie den Spaltennamen, der das Schlüsselwort sql enthält> Festschreiben.

select [from] from <table>

Hinweis: Das oben Genannte funktioniert in MySQL nicht


1

Nach den Antworten hier und meiner eigenen Erfahrung zu urteilen. Die einzig akzeptable Antwort, wenn Sie vorhaben, portabel zu sein, besteht darin, keine SQL-Schlüsselwörter für Tabellen-, Spalten- oder andere Namen zu verwenden.

Alle diese Antworten funktionieren in den verschiedenen Datenbanken, aber anscheinend unterstützen viele die ANSI-Lösung nicht.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.