SQL-Standard, um Spaltennamen zu umgehen?

96

Gibt es einen SQL-Standard, um einen Spaltennamen zu umgehen? Wenn nicht, was funktioniert für MySQL und SQLite? funktioniert es auch für sqlserver?


quelle

Antworten:

88

Anführungszeichen "

Der SQL: 1999- Standard gibt an, dass doppelte Anführungszeichen (") ( QUOTATION MARK ) zum Abgrenzen von Bezeichnern verwendet werden.

<delimited identifier> ::= <double quote> <delimited identifier body> <double quote>

Oracle, PostgreSQL, MySQL, MSSQL und SQlite unterstützen alle "als Bezeichnerbegrenzer.

Sie werden nicht alle "als "Standard" verwendet. Beispielsweise müssen Sie MySQL im ANSI-Modus ausführen, und SQL Server unterstützt dies nur, wenn dies der Fall QUOTED_IDENTIFIERist ON.

Dean Harding
quelle
76

Nach SQLite ,

  • 'foo' ist eine SQL-Zeichenfolge
  • "foo" ist eine SQL-Kennung (Spalte / Tabelle / usw.)
  • [foo] ist eine Kennung in MS SQL
  • `foo` ist eine Kennung in MySQL

Für qualifizierte Namen lautet die Syntax: "t"."foo"oder [t].[foo]usw.

MySQL unterstützt den Standard "foo", wenn die ANSI_QUOTESOption aktiviert ist.

tc.
quelle
3
Beachten Sie, dass SQLite die 'foo'Interpretation als Bezeichner zulässt , wenn der Kontext keine Zeichenfolge zulässt, und "foo"die Interpretation als Zeichenfolge, wenn der Kontext keinen Bezeichner zulässt. Es wird jedoch darauf hingewiesen, dass dieses Verhalten möglicherweise in Zukunft entfernt wird Versionen.
Thomasrutter
Also, wie machst du "t". *?
Loenix
2
@thomasrutter Ja, ich wurde total von diesem Verhalten gebissen ... Ich habe versucht es zu benutzen WHERE "nonexistent_column" = 0und sqlite hat es einfach glücklich ausgeführt und so getan, "nonexistent_column"als wäre es eine Zeichenfolge. Die vollständige Qualifizierung des Namens als "my_table"."nonexistent_column"zwingt SQLite dazu, sich strenger zu verhalten.
Rufflewind
foo, "foo"Und 'foo'für mich nicht mit MySQL arbeiten. Es waren Backticks erforderlich. Und um die Sache noch schlimmer zu machen, lieferte MySQL nutzlose Fehlermeldungen .
JWW
22

Verwenden Sie für MySQL Back Ticks `.

Zum Beispiel:

SELECT `column`, `column2` FROM `table`
Kerry Jones
quelle
19

Verwenden Sie für MS SQL [und]

SELECT [COLUMN], [COLUMN 2] FROM [TABLE]
BoltBait
quelle
2
Sie können Leerzeichen in Spaltennamen mit ms sql haben!?!
3
du kannst! Ich würde es aber nicht tun.
JMP
1
Ja, Sie können in MSSQL Leerzeichen oder reservierte Wörter als Entitätsnamen verwenden. Sie müssen sie nur [].
BoltBait
6
Übrigens, wenn Sie [und] in MS SQL Server verwenden und das Zeichen] im Namen selbst verwenden möchten (aus welchem ​​Grund auch immer), müssen Sie es mit einem anderen] Zeichen maskieren (dh]] anstelle von] verwenden) ).
Daniel James Bryars
2

Für DBASE / DBF verwenden Sie [und]

SELECT [DATE], [TIME], [ANY_OTHER_TO_BE_ESCAPED_COLUMN] FROM [TABLE]
Serhii Matrunchyk
quelle
1

Einige Antworten zusammenstellen:

MS SQL (auch bekannt als T-SQL), Microsoft Access SQL, DBASE / DBF: SELECT [COLUMN], [COLUMN2] FROM [TABLE]

MySQL: SELECT `COLUMN`, `COLUMN2` FROM `TABLE`

SQLite, Oracle, Postgresql: SELECT "COLUMN", "COLUMN2" FROM "TABLE"

Bitte hinzufügen / bearbeiten!

Orangecaterpillar
quelle