Come gestire i nomi delle colonne SQL che sembrano parole chiave SQL?


226

Si chiama una delle mie colonne from. Non posso cambiare il nome perché non ce l'ho fatta. Posso fare qualcosa di simile SELECT from FROM TableNameo esiste una sintassi speciale per evitare che SQL Server venga confuso?


3
Direi usare le doppie virgolette di ANSI SQL per identificatori delimitati. Funzionerà su quasi tutti i dbms, incluso SQL Server. Cioè semplicemente SELECT "from" FROM TableName, bello e portatile!
Jarlh,

Risposte:


354

Avvolgi il nome della colonna tra parentesi in questo modo, fromdiventa [da].

select [from] from table;

È anche possibile utilizzare quanto segue (utile durante l'interrogazione di più tabelle):

select table.[from] from table;

10
Che dire: select TableName.from from TableName; PS: funziona in MySQL
Fabricio PH,

1
L'ho provato stamattina e non sembra funzionare nella mia installazione di MySQL. È un parametro o qualcosa che lo attiva?
CodeChimp

@CodeChimp - provare a utilizzare apici inversi, stackoverflow.com/questions/2901453/...~~V~~singular~~3rd Questa domanda / risposta è specifico per MS SQL Server.
tvanfosson,

Giusto, ma @FabricioPH lo ha menzionato lavorando in MySQL. Mi sono imbattuto qui da una ricerca su Google dopo averlo provato sulla mia installazione MySQL locale. Stavo cercando di vedere se esisteva un modo ANSI SQL generico per sfuggire a cose come questa in SQL. Attualmente stiamo utilizzando SQL Server 2005, ma abbiamo anche Oracle in alcune delle nostre altre app. Vorremmo codificare i nostri DAO Java in modo tale che se mai ci venisse detto di passare da SQL Server a qualcos'altro, semplicemente "funzionerebbe".
CodeChimp

@CodeChimp Riesco a contare il numero di volte che mi è successo senza dita. :)
tvanfosson,

25

Se fosse stato in PostgreSQL, usa le doppie virgolette attorno al nome, come:

select "from" from "table";

Nota: PostgreSQL internamente converte automaticamente tutti i comandi e i parametri non quotati in minuscolo. Ciò ha l'effetto che i comandi e gli identificatori non fanno distinzione tra maiuscole e minuscole. serie * da tAblE; viene interpretato come seleziona * dalla tabella; . Tuttavia, i parametri tra virgolette doppie vengono utilizzati così come sono, e quindi SONO case sensitive: selezionare * da "tabella"; e seleziona * da "Tabella"; ottiene il risultato da due diverse tabelle.


Le virgolette doppie funzionano anche per MS SQL, senza la distinzione tra maiuscole e minuscole. Gli identificatori tra virgolette sono solo, AFAIK, un'alternativa equivalente agli identificatori delimitati da parentesi.
P Daddy,

Le virgolette doppie funzionano anche per il motore di query Presto SQL utilizzato da Athena di Amazon.
Will Humphreys,

21

Mentre lo stai facendo, alias come qualcos'altro (o meglio ancora, usa una vista o un SP e deprecare il vecchio metodo di accesso diretto).

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

14

Questi sono i due modi per farlo:

  1. Usa la citazione indietro come qui:

SELEZIONA `from` FROM TableName

  1. Puoi menzionare con il nome della tabella come:

SELECT TableName.from FROM TableName


Grazie! Ciò ha salvato la mia query sui fogli di Google che ha cercato di estrarre dalla colonna BY
Paul,

1
Grazie, la sintassi con virgolette doppie e parentesi quadre non ha funzionato con il mio client (MySQLWorkbench), ma il metodo tick posteriore ha funzionato.
kingInTheNorth

10

La tua domanda sembra avere una risposta corretta qui, ma voglio solo aggiungere un altro commento a questo argomento.

Chi progetta il database dovrebbe essere ben consapevole delle parole chiave riservate ed evitare di usarle. Se scopri qualcuno che lo utilizza, informalo (in modo educato). La parola chiave qui è parola riservata .

Maggiori informazioni:

"Le parole chiave riservate non devono essere utilizzate come nomi di oggetti. I database aggiornati da versioni precedenti di SQL Server possono contenere identificatori che includono parole non riservate nella versione precedente, ma che sono parole riservate per la versione corrente di SQL Server. È possibile fare riferimento a oggetto utilizzando identificatori delimitati fino a quando il nome non può essere modificato. " http://msdn.microsoft.com/en-us/library/ms176027.aspx

e

"Se il database contiene nomi che corrispondono a parole chiave riservate, è necessario utilizzare identificatori delimitati quando si fa riferimento a tali oggetti. Per ulteriori informazioni, consultare Identificatori (DMX)." http://msdn.microsoft.com/en-us/library/ms132178.aspx


2
Meglio ancora usare SEMPRE le parentesi per gli oggetti del database.
sbattere

8

Se stai usando SQL Server, puoi semplicemente avvolgere le parentesi quadre attorno alla colonna o al nome della tabella.

select [select]
from [table]

5

In Apache Drill, utilizzare i backquotes:

select `from` from table;

3

Ho anche affrontato questo problema. E la soluzione per questo è inserire [Column_Name] in questo modo nella query.

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

Quindi funzionerà perfettamente.


3

Ciao, lavoro su sistemi Teradata completamente conformi ANSI. Usa le virgolette doppie "" per nominare tali colonne.

Ad esempio, typeè una parola chiave riservata SQL e, se utilizzata tra virgolette, typeviene trattata come un nome specificato dall'utente.

Vedi sotto esempio di codice:

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

Confermo che funziona in DBeaver con il database Teradata, grazie!
Paul,

1

Puoi inserire il nome della colonna tra parentesi come:

Select  [from] from < ur_tablename>

O

Metti in una tabella temprary quindi usa come preferisci.
Esempio:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

Qui presumo solo che your_tablename contenga solo una colonna (ovvero da).


3
Ciò presume che [from]sia l'unica colonna che your_tablenameha.
Andriy M,

Cosa guadagni dalla tabella temporanea? Sembra completamente inutile, niente a che fare con la domanda.
rjmunro,

@rjmunro, no, questo non sembra del tutto inutile. Ho un caso in cui eseguo una query su un cubo tabulare da SQL e restituisce nomi di colonne come "[Totale]". Cioè, il nome stesso contiene '[' e ']'. Non puoi usare [[Totale]] e [Totale] per recuperare una colonna del genere. Il modo più semplice è inserire il risultato della query in una tabella temporanea.
darlove,

@darlove Non puoi utilizzare le virgolette: "[Total]"? O forse c'è un modo per evitarlo, qualcosa del genere [\[Total\]]?
rjmunro,

@rjmunro, dopo aver sperimentato un po 'questo ho trovato un altro modo di cui non sapevo: puoi impostare QUOTED_IDENTIFIER su ON e quindi usare quello di cui stai parlando, la doppia citazione ". Quindi, è solo un altro ma non scarterei completamente l'opzione della tabella temporanea
darlove

1

Ho riscontrato lo stesso problema durante il tentativo di aggiornare una colonna il cui nome era una parola chiave . La soluzione sopra non mi ha aiutato. L'ho risolto semplicemente specificando il nome della tabella in questo modo:

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

1

Di seguito funzionerà perfettamente:

SELECT DISTINCT table.from AS a FROM table

1

In MySQL, in alternativa all'utilizzo di virgolette (`), è possibile utilizzare l'interfaccia utente per modificare i nomi delle colonne. Fare clic con il tasto destro del mouse sulla tabella> Modifica tabella> Modifica il nome della colonna che contiene la parola chiave sql> Commit.

select [from] from <table>

Come nota, quanto sopra non funziona in MySQL


1

A giudicare dalle risposte qui e dalla mia esperienza. L'unica risposta accettabile, se stai pianificando di essere portatile, non utilizzare parole chiave SQL per tabella, colonna o altri nomi.

Tutte queste risposte funzionano nei vari database ma apparentemente molto non supportano la soluzione ANSI.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.